在这种情况下,调用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);
}
您的来电顺序是这样的:
main();
foo();
bar();
而你的输出将是这样的:
bar a = 2
foo a = 1
main a = 0
的参数是按值传递的,所以a
是抄并且在每个函数中实际上是一个不同的变量。递归也一样。
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()
和你的输出应该是:1213121反映的树结构电话:
3
/\
/ \
2 2
/\ /\
1 1 1 1
目前看来它什么也没做。如果它传递一个正值,则不会发生任何事情,而负值将进入无限递归。另外,你的函数没有返回类型。 – 2012-08-01 12:40:04
为了理解递归,你必须先理解递归。 – 2012-08-01 12:40:23
由于第一次调用的值小于0,所以'if'条件被评估为False,并且没有任何反应。我认为正确的条件应该是:'if(a> 0)'。 – danihp 2012-08-01 12:41:10