c语言递归为什么不会无限循环?

Void up(int);
int main()
{
Up(1);
Return 0;
}
Void up(int n)
{
Printf("%d",n);
If(n<4)
Up(n+1);
Printf("%d",n);
}
为什么不会从1-4,4-1然后反复打印呢?
初学者一枚,手机打字,所以大小写有误。

2个回答

递归说到底是函数自己调用自己并且是嵌套调用,只要是调用,总有返回的时候,也就是被调函数结束返回上一级(调用函数)继续执行。
在这里,函数调用自己时,传递的参数是值传递,被调函数并不会改变调用函数中的变量。请看下面的例子:
int add(int n){
n++;
return 0;
}
int main(){
int a = 5;
add(a);
printf("a = %d\n",a);//猜猜a等于几, 答案是a=5,原因是值传递,也就是执行add(a)时,把a复制了一份传给add函数的参数n。并不是把a自己
//传给了add函数。
}
递归的本质是函数调用。只要是调用就有返回的时候。就是被调函数结束返回后,继续执行调用函数。在你的例子里就是执行printf("%d\n",n);-->up(n+1)后面的。

递归第一次传入参数是1,进到函数发现1<4 又调用了UP(1+1)也就是UP(2),一次类推,直到调用到UP(4),进去后发现4<4不成立,你看被调用的UP函数在调用返回后就去执行下面的Printf("%d",n)了,然后就直接返回到曾经调用它的地方,以此类推他就一级级返回直到最先调用它的main函数那里。

domybest111
SkyAurora 回复qq_36590891: 递归为每一次的调用在栈内单独开辟一个空间,同一个函数不同时间调用都是独立的。不要认为n第二次是1,看见UP函数内部调用了自己UP(n+1)了么,函数第一次进入时n=1,那么调用的是UP(2),当进入UP(2)里时,n=2,然后又调用了UP(n+1),也就是UP(3),最后一次调用UP(4),进去发现n=4<4不成立,就执行了Printf("%d",n=4);然后到了函数结尾,返回调用UP(4)的那个位置,继续往下走,遇见了Printf("%d",n=3);然后又到了函数结尾,返回调用UP((n=2) + 1 = 3)的位置,下面就执行Printf("%d",n=2);直到返回到主函数调用的UP(1)位置结束整个程序。
接近 4 年之前 回复
qq_36590891
qq_36590891 回复SkyAurora: 多谢回答!但我还是不太理解,当n第二次等于1后它岂不是符合n<4的条件,所以会无限循环打印吗?还有就是请问第二个printf返回给了哪一条函数?
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问