'빠져나가기'부분을 정확히 해야 될것 같습니다.
그렇지 않으면 무한반복에 빠져 버릴 수 있겠습니다.
그리고, 요즘 제가 중요하게 느끼는 것인데,
재귀호출도 반복해서 호출하는 것인데, 왜 반복호출하지 않고 재귀호출하는가입니다.
곰곰히 생각해 봤는데, 반복호출은 명시적으로 반복횟수가 있어야 하는데(for 루프 처럼)
재귀호출은 반복횟수를 명시적으로 주지 않아도 내부 논리에 의해 빠져나가는 부분이 있다는 것입니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
사실 로직의 측면에서 본다면 iteration이나 recursion이나
결국 induction이라는 점에서 크게 다르지 않을 겁니다.
익숙함의 차이라는 게 제가 볼 때는
대개 프로그래밍을 처음 배우면서
코드가 제대로 동작하는 가를 따져보는 과정을
수학적 증명이 아니라 테스팅으로 하기 때문인 것 같습니다.
만약 자신이 작성한 코드가 제대로 되었다는 것을
수학적으로 증명하도록 요구받는다면,
대개의 경우 수학적 귀납법이 가장 쉬운 방법일 것이므로
iteration이나 recursion 중에 특별한 선호를 가지지 않게 될 것이라 생각합니다.
"recursion이 인간에게 더 친숙하다"고 주장하는 것은
결국 "수학적 귀납법이 손쉬운 증명 방법 중 하나이다" 라는 것과 크게 다르지 않은 뜻이지요.
예를 들어 양수 n을 입력받아 1부터 n 까지의 합을 구하는 코드를 작성하라고 한다면
별 어려움 없이 다음과 같은 코드를 작성할 것입니다.
unsigned int sum(unsigned int n) {
unsigned int result = 0;
for (unsigned int i = 1; i <= n; i++) result += i;
return result;
}
저 코드를 제대로 작성했는가 물으면 대부분의 경우 몇 가지 n을 입력해보고
손으로 계산한 값과 같으니 제대로 되었다고 대답하겠지요.
저기에서 loop invariant를 찾고 그에 따라 루프가 끝난 후
sum이 1부터 n까지의 합과 동일하게 된다는 것을 증명하는 방법은
대학에 와서야 처음 배우게 됩니다.
그마저 골치 아프다고 별로 관심을 두지 않게 되구요.
프로그래머들은 워낙 공부할 게 많은 탓에
위의 for loop에서 변수 i를
어째서 induction variable (귀납 변수)라고 부르는 가를
진지하게 생각해 볼 수 있는 여유를 가지기 힘든 것 같습니다. ^^
아~
재귀호출...
처음 프로그램 배울 때 그래픽쪽을 먼저 찾아봤는데 그때 나온 부분이죠.
그때 본 부분이 아마 색 채우기 부분이었을 겁니다.
즉, 현재 시점을 기준으로 1)좌 2)우 3)상 4)하 형태로 재귀호출을 하는 부분이었죠.
제 경우에는 데이터를 가지고 배운 것이 아니라 이미지를 통해서 이해를 했기에 좀더
쉽게 이해했었는지 모르겠네요.
결론적으로 '빠져나가기'부분만 정확하다면 어렵지 않게 따라갈 수 있지 않나 생각되네요.
(어떤 문제라도 이해하고나면 쉬운데 이해되기전이 어려울 따름이죠. :-))
------------------------------
좋은 하루 되세요.
------------------------------
좋은 하루 되세요.
지적하신 것처럼
'빠져나가기'부분을 정확히 해야 될것 같습니다.
그렇지 않으면 무한반복에 빠져 버릴 수 있겠습니다.
그리고, 요즘 제가 중요하게 느끼는 것인데,
재귀호출도 반복해서 호출하는 것인데, 왜 반복호출하지 않고 재귀호출하는가입니다.
곰곰히 생각해 봤는데, 반복호출은 명시적으로 반복횟수가 있어야 하는데(for 루프 처럼)
재귀호출은 반복횟수를 명시적으로 주지 않아도 내부 논리에 의해 빠져나가는 부분이 있다는 것입니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
while(1) 돌리고
while(1) 돌리고 내부에서 if문으로 break 걸 때는 명시적인 반복회수가 필요없습니다.
Summa Cum Laude http://ceraduenn.egloos.com
아.. 맞는 지적입니다. 그런데,
for(반복조건);
while(1) { if(조건) break; }
위의 코드는 모두 제어문으로 반복되지만,
재귀호출은 위의 제어문이 없어도 반복된다는 점도 생각해 보면,
재미있을듯합니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
스택을 따로 만들지
스택을 따로 만들지 않아도 되니까 오히려 편하지 않나요?
--------------------------------------------------------------------------------
http://blog.sumin.us
재귀의 특징은
재귀의 특징은 제어조건변수들이 해당단계마다 모두 따로 존재한다는것입니다.
이는 제어도가 루프보다 훨씬 정밀?함을 의미하죠..
즉, 루프의경우는 초기에정해진 제어변수에 그것도 다중으로 제어되기 힘들다는것이죠..
초기에 정한 i 변수 하나를 정해수행했지만.... 차후 1 과 2 를 동시에 저장할수가 없다는것입니다.
구글에 검색해보니
구글에 검색해보니 이런 페이퍼가 있는데 꽤 재미있군요.
제목은 The advent of recursion in programming, 1950s-1960s
http://www.illc.uva.nl/Publications/ResearchReports/PP-2010-04.text.pdf
재귀: (명) 재귀를
재귀: (명)
재귀에 대해
재귀에 대해 사람들이 어렵고 불편하게 느끼는 걸 보면 함수형 프로그래밍 또는 수학이란게 말과는 달리 인간에게 그다지 직관적인 것은 아니라는 생각이 들때가 있습니다.
아니면 단지 익숙하지 않아서 그런걸까요?
화이팅(fighting) 말고 화이트닝(whitening) 하면 안되나요.
저도 재귀는 정말
저도 재귀는 정말 싫어하는 사람중 한 명입니다.
제가 작성하는 코드의 웬만한 로직은 될수있으면 재귀를 안하죠.
그런데 얼마전에 erlang이라는 함수형 언어를 공부할 기회가 있었어요.
다른 함수형 언어와 마찬가지로 모든 로직을 재귀로 작성해야 하는 언어였죠.
처음에는 정말 적응안되고 머릿속에서 감 안잡히고 했는데 조금 하다보니 또 익숙해 지더라구요.
함수형 언어 옹호론자들은 함수형 언어가 좀더 수학식에 가깝고 이것이 인간에게 더 친숙한 접근법이다~~
라고 하는 사람들이 있는데,
제 생각에는 꼭 그렇다기 보다, 그야말로 익숙함의 차이인것 같아요.
만약 제가 C언어가 아니라 헤스켈같은거로 프로그래밍을 시작했다면 당연히 재귀가 더 익숙했겠죠.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
사실 로직의
사실 로직의 측면에서 본다면 iteration이나 recursion이나
결국 induction이라는 점에서 크게 다르지 않을 겁니다.
익숙함의 차이라는 게 제가 볼 때는
대개 프로그래밍을 처음 배우면서
코드가 제대로 동작하는 가를 따져보는 과정을
수학적 증명이 아니라 테스팅으로 하기 때문인 것 같습니다.
만약 자신이 작성한 코드가 제대로 되었다는 것을
수학적으로 증명하도록 요구받는다면,
대개의 경우 수학적 귀납법이 가장 쉬운 방법일 것이므로
iteration이나 recursion 중에 특별한 선호를 가지지 않게 될 것이라 생각합니다.
"recursion이 인간에게 더 친숙하다"고 주장하는 것은
결국 "수학적 귀납법이 손쉬운 증명 방법 중 하나이다" 라는 것과 크게 다르지 않은 뜻이지요.
예를 들어 양수 n을 입력받아 1부터 n 까지의 합을 구하는 코드를 작성하라고 한다면
별 어려움 없이 다음과 같은 코드를 작성할 것입니다.
unsigned int sum(unsigned int n) {
unsigned int result = 0;
for (unsigned int i = 1; i <= n; i++) result += i;
return result;
}
저 코드를 제대로 작성했는가 물으면 대부분의 경우 몇 가지 n을 입력해보고
손으로 계산한 값과 같으니 제대로 되었다고 대답하겠지요.
저기에서 loop invariant를 찾고 그에 따라 루프가 끝난 후
sum이 1부터 n까지의 합과 동일하게 된다는 것을 증명하는 방법은
대학에 와서야 처음 배우게 됩니다.
그마저 골치 아프다고 별로 관심을 두지 않게 되구요.
프로그래머들은 워낙 공부할 게 많은 탓에
위의 for loop에서 변수 i를
어째서 induction variable (귀납 변수)라고 부르는 가를
진지하게 생각해 볼 수 있는 여유를 가지기 힘든 것 같습니다. ^^
위의
1에서 n까지 합을 구하는 코드를 recursion으로 작성하면 아래와 같습니다.
iteration는 i, n, result 라는 3개의 변수를 사용하는데, recursion에서는 n 변수 하나만 사용하는 것이 흥미롭습니다.
iteration과 recursion은 서로 장단점이 있을듯 한데요...
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
템플릿 메타 프로그래밍
C++에서도 리커션은 유용합니다.