이 경우, fun()를 호출하는 것은 다른 함수를 호출하는 것과 같습니다. 예를 들어 :
int main() {
int a = 0;
foo(a);
printf("main a = %d\n", a);
}
void foo(int a) {
a = 1;
bar(a);
printf("foo a = %d\n", a);
}
void bar(int a) {
a = 2;
printf("bar a = %d\n", a);
}
귀하의 호출 순서 다음과 같이 :
bar a = 2
foo a = 1
main a = 0
인수는 값에 의해 전달되는, 그래서 a
복사 :
main();
foo();
bar();
그리고 당신의 출력이 될 것입니다이고 실제로 각 기능의 다른 변수입니다. 재귀에서도 마찬가지입니다.
main(); x = 3
fun(3); a = 3, so a > 0, nothing happens, return to main()
당신은 재미() 자신을 호출 있도록> 0
main(); x = 3
fun(3); a = 3, a > 0 so --a = 2, fun(2)
fun(2); a = 2, a > 0 so --a = 1, fun(1)
fun(1); a = 1, a > 0 so --a = 0, fun(0)
fun(0); a = 0, so return to fun(1)
fun(1); printf("%d", a) displays 1, --a = 0, fun(0) /* same as fun(1) above */
fun(0); a = 0, so return to fun(1)
fun(1); nothing left to do so return to fun(2) /* same as fun(1) above */
fun(2); printf("%d", a) displays 2, --a = 1, fun(1)
fun(1); a = 1, a > 0 so --a = 0, fun(0) /* this is a new fun(1) */
fun(0); a = 0, so return to fun(1)
fun(1); printf("%d", a) displays 1, --a = 0, fun(0)
fun(0); a = 0, so return to fun(1)
fun(1); nothing left to do so return to fun(2)
fun(2); nothing left to do so return to fun(3)
fun(3); printf("%d", a) displays 3, --a = 2, fun(2) /* halfway point */
fun(2); a = 2, a > 0 so --a = 1, fun(1)
fun(1); a = 1, a > 0 so --a = 0, fun(0)
fun(0); a = 0, so return to fun(1)
fun(1); printf("%d", a) displays 1, --a = 0, fun(0)
fun(0); a = 0, so return to fun(1)
fun(1); nothing left to do so return to fun(2)
fun(2); printf("%d", a) displays 2, --a = 1, fun(1)
fun(1); a = 1, a > 0 so --a = 0, fun(0)
fun(0); a = 0, so return to fun(1)
fun(1); printf("%d", a) displays 1, --a = 0, fun(0)
fun(0); a = 0, so return to fun(1)
fun(1); nothing left to do so return to fun(2)
fun(2); nothing left to do so return to fun(3)
fun(3); nothing left to do so return to main()
을 (위에서 아래로 읽기) 그리고 당신의 출력해야 할 때 조건을 변경했다 경우의 트리 구조를 반영 1,213,121을 전화 :
3
/\
/ \
2 2
/\ /\
1 1 1 1
지금은 아무것도하지 않는 것 같습니다. 전달 된 값이 양수이면 아무것도 수행되지 않고 음수 값이면 무한 재귀가 입력됩니다. 또한 함수에는 반환 형식이 없습니다. –
재귀를 이해하려면 먼저 재귀를 이해해야합니다. –
첫 번째 호출은 0보다 valued grather가 있기 때문에 'if'조건은 False로 평가되고 아무 것도 발생하지 않습니다. 올바른 조건은'if (a> 0)'이어야한다고 생각합니다. – danihp