96쪽 해설에
Recursive(5)
(2*recursive(4))+1 하면
2곱하기 4는 8하고 +1하면 9전달 아닌가요 ?
4전달은 뭔가요 ??
계산방법이 어떻게 되나요 ?
Recursive(1)도
2*0+1이면 1이아닌가요? 0전달은 무엇이고
리턴할때 recursive(0)에서 recursive(1)로 왜 2가 반환
되는 걸까요 2는 어디서 나온가죠 ?
안녕하세요. 길벗 수험서 운영팀입니다.
① int recursive(int n) { ② int i; ③ if (n < 1) ④ return 2; ⑤ else ⑥ { ⑦ i = (2 * recursive(n - 1)) + 1; ⑧ printf("%d\n", i); ⑨ return i; ⑩ } ⑪ } |
먼저 사용자 함수에 대한 정확한 이해가 필요할 것 같습니다.
메인에서 수행된 recursive(5)는 recursive라는 사용자 정의 함수를 수행하되 n에 5값을 부여한 상태에서 그 아래에 적힌 구문들을 수행하라는 의미입니다.
1. recursive(5)를 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
2. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
3. i에 (2 * recursive(4)) + 1을 저장해야 하므로 recursive(4)를 다시 구해야 합니다.
4. recursive(4)를 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
5. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
6. i에 (2 * recursive(3)) + 1을 저장해야 하므로 recursive(3)을 다시 구해야 합니다.
7. recursive(3)을 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
8. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
9. i에 (2 * recursive(2)) + 1을 저장해야 하므로 recursive(2)를 다시 구해야 합니다.
10. recursive(2)를 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
11. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
12. i에 (2 * recursive(1)) + 1을 저장해야 하므로 recursive(1)을 다시 구해야 합니다.
13. recursive(1)을 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
14. ③의 n<1은 참이므로 ④를 수행합니다.
15. ④는 2라는 값을 돌려주며 recursive(1)을 종료합니다.
이제 드디어 종료되었으니 값을 다시 돌려주며 계산해보겠습니다.
13~15에 해당하는 recursive(1)은 2라는 결과 값이 나왔습니다.
10~12에 해당하는 recursive(2)는 (2 * recursive(1)) + 1이므로 recursive(1)은 2라고 앞에서 나왔으니 (2*2)+1이 되어 5라는 값이 나옵니다.
7~9에 해당하는 recursive(3)은 (2 * recursive(2)) + 1이므로 recursive(2)는 5라고 앞에서 나왔으니 (2*5)+1이 되어 11이라는 값이 나옵니다.
4~6에 해당하는 recursive(4)는 (2 * recursive(3)) + 1이므로 recursive(3)는 11이라고 앞에서 나왔으니 (2*11)+1이 되어 23이라는 값이 나옵니다.
1~3에 해당하는 recursive(5)는 (2 * recursive(4)) + 1이므로 recursive(4)는 23이라고 앞에서 나왔으니 (2*23)+1이 되어 47이라는 값이 나옵니다.
이를 수학을 이용해 한 식으로 풀어내면 recursive(5)는 2*(2*(2*(2*2+1)+1)+1)+1 이 되겠습니다.
행복한 하루되세요.^^
-
*2018-09-14 15:12:35
안녕하세요. 길벗 수험서 운영팀입니다.
① int recursive(int n) {
② int i;
③ if (n < 1)
④ return 2;
⑤ else
⑥ {
⑦ i = (2 * recursive(n - 1)) + 1;
⑧ printf("%d\n", i);
⑨ return i;
⑩ }
⑪ }
먼저 사용자 함수에 대한 정확한 이해가 필요할 것 같습니다.
메인에서 수행된 recursive(5)는 recursive라는 사용자 정의 함수를 수행하되 n에 5값을 부여한 상태에서 그 아래에 적힌 구문들을 수행하라는 의미입니다.
1. recursive(5)를 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
2. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
3. i에 (2 * recursive(4)) + 1을 저장해야 하므로 recursive(4)를 다시 구해야 합니다.
4. recursive(4)를 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
5. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
6. i에 (2 * recursive(3)) + 1을 저장해야 하므로 recursive(3)을 다시 구해야 합니다.
7. recursive(3)을 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
8. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
9. i에 (2 * recursive(2)) + 1을 저장해야 하므로 recursive(2)를 다시 구해야 합니다.
10. recursive(2)를 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
11. ③의 n<1은 거짓이므로 ⑦을 수행합니다.
12. i에 (2 * recursive(1)) + 1을 저장해야 하므로 recursive(1)을 다시 구해야 합니다.
13. recursive(1)을 수행하게 되면 ②에서 i를 선언한 후 ③으로 갑니다.
14. ③의 n<1은 참이므로 ④를 수행합니다.
15. ④는 2라는 값을 돌려주며 recursive(1)을 종료합니다.
이제 드디어 종료되었으니 값을 다시 돌려주며 계산해보겠습니다.
13~15에 해당하는 recursive(1)은 2라는 결과 값이 나왔습니다.
10~12에 해당하는 recursive(2)는 (2 * recursive(1)) + 1이므로 recursive(1)은 2라고 앞에서 나왔으니 (2*2)+1이 되어 5라는 값이 나옵니다.
7~9에 해당하는 recursive(3)은 (2 * recursive(2)) + 1이므로 recursive(2)는 5라고 앞에서 나왔으니 (2*5)+1이 되어 11이라는 값이 나옵니다.
4~6에 해당하는 recursive(4)는 (2 * recursive(3)) + 1이므로 recursive(3)는 11이라고 앞에서 나왔으니 (2*11)+1이 되어 23이라는 값이 나옵니다.
1~3에 해당하는 recursive(5)는 (2 * recursive(4)) + 1이므로 recursive(4)는 23이라고 앞에서 나왔으니 (2*23)+1이 되어 47이라는 값이 나옵니다.
이를 수학을 이용해 한 식으로 풀어내면 recursive(5)는 2*(2*(2*(2*2+1)+1)+1)+1 이 되겠습니다.
행복한 하루되세요.^^