c-无法理解递归是如何工作的



我试图理解递归,但停留在一个非常基本的概念上。以下代码

int fun(int i) {
if(i>1) {
printf("%d---n",i);
fun(i-1);

printf("%d***n",i);
}
else {
return i;
}
}
int main() {
// Write C code here
int i=fun(5);
printf(">>%d",i);
return 0;
}

其给出输出

5---
4---
3---
2---
2***
3***
4***
5***
>>5

但编码

int fun(int i){
if(i>1){
//printf("%d---n",i);
fun(i-1);

// printf("%d***n",i);
}
else {
return i;
}
}

给出

>>1

谁能解释一下流量控制吗?

主要问题可能是,在递归情况下(i>1(,函数没有返回显式值,因此返回值只是从堆栈中获取的。在gcc中使用诸如-Wall之类的编译器标志应该突出这一点。尝试:

int fun(int i) {
if(i>1) {
printf("%d---n",i);
int ret = fun(i-1);

printf("%d***n",i);
printf("%d+++n",ret);
return ret;
}
else {
return i;
}
}

它的工作原理与此非递归版本完全相同,即"打印一些东西,然后调用一个函数,然后打印其他东西":

int fun1()
{
return 1;
}
int fun2() {
printf("%d---n",2);
fun1();
printf("%d***n",2);
}
int fun3() {
printf("%d---n",3);
fun2();
printf("%d***n",3);
}
int fun4() {
printf("%d---n",4);
fun3();
printf("%d***n",4);
}
int fun5() {
printf("%d---n",5);
fun4();
printf("%d***n",5);
}
int main() {
int i = fun5();
printf(">>%d",i);
return 0;
}

正如您所看到的,大多数函数调用都无法返回值,这会导致未定义的行为
这就是为什么您会看到不同的最终结果,而优秀的编译器会对这种情况发出警告。

实际情况可能是,您正在打印任何函数返回的最新值
打印时,这是从上一个printf返回的值,返回5(printf返回写入的字符数;在第二个printf中添加或删除字符,然后观察发生了什么(。

最新更新