생활
반환값이 나오는 계산과정이 궁금합니다
위에 문제의 반환값은 95이고
아래의 문제는 3이라는데
어떻게 그 값들이 나오는지 모르겠습니다..
그리고 반환값을 출력하려면 저 함수 내에서 해야할까요? 아님 main에서 해야할까요?
4개의 답변이 있어요!
1번 문제부터 풀어 보겠습니다.
재귀할때 들어가는 n 값은 recursive(n-1) 에 의하여 1씩 감소합니다.
여기서 n값이 0이 되면 if(n < 1) return 2; 을 만나 2를 반환하므로 n 값은 5 4 3 2 1 0 순으로 감소합니다.
그러면 값 별 반환값을 봅시다n = 0 일때는 if(n < 1) 구문을 들어가 2 가 반환됩니다.
n = 1 일때는 2 * recursive(1 - 1) + 1 을 실행합니다 이는 2 * recursive(0) + 1 이며 n이 0일때 반환값은 위에있는 2 이므로
2 * 2 + 1 즉 5가 반환됩니다.
n = 2 일때는 2 * recursive(2 - 1) + 1 이것도 위와 동일하게 2 * 5 + 1 즉 11 입니다.
n = 3 일때는 위와 동일한 방식으로 구하면 2 * 11 + 1 으로 23
n = 4 일때는 2 * 23 + 1 으로 47
n = 5 일때는 2 * 47 + 1 으로 95즉 recursive(5) 은 95를 반환합니다
이 순서대로 값이 나오게 되는것 입니다.
2번도 위에서 푼 방식과 동일하게 풀면 됩니다.
들어가는 n 값을 보면 recursive(n-3) 즉 10 7 4 1 -2 입니다.n = -2 일때는 if(n < 1) return -1; 을 만나서 -1
n = 1 일때는 recursive(1-3) +1 이며 recursive(2)은 -1 이므로 -1 + 1 즉 0을 반환합니다.
n = 4 일때는 recursive(4-3) +1 이며 0 + 1 즉 1을 반환합니다.
n = 7 일때는 위와 동일한 방식으로 계산하면 1 + 1 즉 2 를 반환합니다
n = 10 일때는 2 + 1 으로 3을 반환합니다.즉 recursive(10) 은 3을 반환합니다
값 출력은 main에서 이처럼 사용하면 됩니다.
int main() { printf("%d\n", recursive(5)); return 0; }5를 입력하면 1보다 작지 않기 때문에 ( 2* recursive(4) +1)이 호출됩니다.
4은 1보다 작지 않기 때문에 ( 2* recursive(3) +1)이 호출됩니다.
3은 1보다 작지 않기 때문에 ( 2* recursive(2) +1)이 호출됩니다.
2은 1보다 작지 않기 때문에 ( 2* recursive(1) +1)이 호출됩니다.
1은 1보다 작지 않기 때문에 ( 2* recursive(0) +1)이 호출됩니다.
0은 1보다 작기 때문에 2를 리턴합니다.
식을 풀어보면 ( 2 (2(2(2(2*(2) +1) +1) +1)) +1) +1) = 95 입니다.
10을 입력하면 1보다 작지 않기 때문에 ( recuresive(7)+1) 이 호출됩니다.
7은 입력하면 1보다 작지 않기 때문에 ( recuresive(4)+1) 이 호출됩니다.
4은 입력하면 1보다 작지 않기 때문에 ( recuresive(1)+1) 이 호출됩니다.
1은 입력하면 1보다 작지 않기 때문에 ( recuresive(-2)+1) 이 호출됩니다.
-2는 1보다 작기 때문에 -1를 리턴합니다.
식을 풀어보면 (((((-1)+1)+1)+1)+1) = 3 입니다.
반환값을 출력하려면 main에서 하시면 될것 같네요.
안녕하세요,
위 문제들은 회귀함수를 이용한 문제입니다.
우선 첫번째 문제의 경우에는
recursive(5)가 호출되었을 때 n에 5를 대입해서 순차적으로 진행해보시면 됩니다.
printf("%d\n, 5); //5가 화면에 출력 if(5<1) return 2; //false니까 실행안됨 else 실행 else return(2*recursive(4)+1);그러면 '2*recursive(4)+1'가 반환 될 겁니다.
여기서 recursive(4)를 다시 실행해봅시다.
printf("%d\n, 4); //4가 화면에 출력 if(4<1) return 2; //false니까 실행안됨 else 실행 else return(2*recursive(3)+1);이번에는 '2*recursive(3)+1' 이 반환됩니다.
그러면 recursive(4) 대신 '2*recursive(3)+1'이 되는겁니다.
이렇게 위의 식에 대입해보면 2*(2*recursive(3))+1 가 됩니다.
계속 반복하다보면 결국 n이 0이 될테고, if 문이 true 되면서 recursive(0)의 반환 값은 2이 되는 경우가 발생합니다.
그러면 2 * ( 2 * ( 2 * ( 2 * ( 2 * 2 + 1) + 1) + 1 ) + 1 ) + 1 이렇게 되고 최종 반환 값은 95가 됩니다.
두번째 문제도 같습니다.
recursive(10)부터 진행해보면
printf("%d\n, 10); //10이 화면에 출력 if(10<1) return -1; //false니까 실행안됨 else 실행 else return(recursive(n-3)+1);이렇게 n값이 1미만이 될 때 까지 반복이 될 겁니다.
(-2 까지 반복되고 -1을 반환)그러면 전체 계산식은 ( ( ( (-1) + 1) + 1 ) +1 ) + 1 이고, 최종 반환 값은 3이 됩니다.
마지막으로 반환 값을 출력하려면, recursive 함수를 사용한 상위 함수에서 출력하면 되겠습니다.
(main 함수에서 recursive 함수를 사용했다면 main 함수에서 출력)예를들어...
int main() { printf("%d\n", recursive(5)); return 0; }이런식으로 하면 최종적으로 회귀함수에서 반환 된 값을 확인 할 수 있습니다.
감사합니다.
안녕하세요
recursive 함수가 몇 번 호출되는지 알면 풀이가 가능합니다.
위에 문제는 인자로 5를 넘겼을 때 1보다 작을 때까지 호출되고, return 구분에서 recursive(n - 1)로 호출하고 있기 때문에 4 ~ 0 (4, 3, 2, 1, 0) 까지 호출됩니다.
recursive의 return은 반대로 나오기 때문에 계산할 때는 0 ~ 4로 계산합니다.
// 0 ~ 4 대입 식 : 2 * recursive(n - 1) + 1 0 대입 : 2 * (recursive(0)) + 1 = 2 * 2(1보다 작을 때 return 2 이므로) + 1 = 5 1 대입 : 2 * 5(0 대입 결과) + 1 = 11 2 대입 : 2 * 11(1 대입 결과) + 1 = 23 3 대입 : 2 * 23(2 대입 결과) + 1 = 47 4 대입 : 2 * 47(3 대입 결과) + 1 = 95아래 문제는 인자로 10를 넘겼을 때 1보다 작을 때까지 호출되고, return 구분에서 recursive(n - 3)로 호출하고 있기 때문에 7, 4, 1, -2 까지 호출됩니다.
recursive의 return은 반대로 나오기 때문에 계산할 때는 -2, 1, 4, 7 로 계산합니다.
// -2, 1, 4, 7 식 : recursive(n - 3) + 1 -2 대입 : (recursive(-2)) + 1 = -1(1보다 작을 때 return -1 이므로) + 1 = 0 1 대입 : 0(-2 대입 결과) + 1 = 1 4 대입 : 1(1 대입 결과) + 1 = 2 7 대입 : 2(4 대입 결과) + 1 = 3반환값을 출력하려면 호출한 부분 (main) 에서 해야 합니다.
int value = recursive(5); printf("%d\n", value);