小白求助 简单的递归问题

Lifework_xc 2018-05-02 11:49:02
#include <iostream>
using namespace std;
int fun(int n)
{
if (n == 1)
return 6;
else
fun(n - 1);
}
int main()
{
cout << fun(10);
}


#include <iostream>
using namespace std;
int fun(int n)
{
if (n == 1)
return 6;
else
return fun(n - 1);
}
int main()
{
cout << fun(10);
}

我想知道第一个程序中当n==1时,return到上层为什么还会继续返回6到上层?return 6;上层并没有return啊,怎么返回6啊?难道不是像第二个程序这样return fun(n-1)吗?
...全文
993 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
引用 18 楼 Lifework_xc 的回复:
[quote=引用 17 楼 phenix2009 的回复:] 还有lz你发的俩程序最后执行结果都是6,不知你纠结个啥呢
就是那个return啊,就像我一开始发的那个程序,之前觉得fun(n-1)没有return的话,6是返回不出去的,然后看了1楼的回复感觉这东西很玄。。[/quote] 你跑一下我给你贴那个例子,里面带不带return的应该写的挺明确的,其实就是个逻辑问题。
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
还有lz你发的俩程序最后执行结果都是6,不知你纠结个啥呢
Lifework_xc 2018-05-03
  • 打赏
  • 举报
回复
引用 17 楼 phenix2009 的回复:
还有lz你发的俩程序最后执行结果都是6,不知你纠结个啥呢
就是那个return啊,就像我一开始发的那个程序,之前觉得fun(n-1)没有return的话,6是返回不出去的,然后看了1楼的回复感觉这东西很玄。。
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
说实话工作里面用递归的机会还是不多的,所以疏忽了,这次回这个贴也重温了一下,感觉不错
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
请看一下这两段代码对比,其实不做返回语法上是没问题,顶多是逻辑有区别: 使用递归来得到两个数的最大公约数 int gcd(int x, int y) { int tmp = x; if(tmp > 0) { if( x > y ) { tmp = x % y; gcd(tmp, y); } else { tmp = y % x; gcd(tmp, x); } } return y; } 其中,gcd()函数的终止条件是tmp>0。也就是说,如果tmp大于0,则递归调用gcd()函数;否则返回y值。使用该函数获得的最大公约数始终为用户输入两个数中的最后一个数,而无法得到正确的值。 从上面的代码分析,gcd()函数的递归终止条件应该没有问题,而递归调用的函数也没有问题。无法得到正确的最大公约数的问题就是处在递归调用gcd()函数时,虽然该函数被递归调用,但是函数的返回值始终是y,因此应该将以上代码修改为 int gcd(int x, int y) { int tmp = x; if(tmp > 0) { if( x > y ) { tmp = x % y; return gcd(tmp, y); } else { tmp = y % x; return gcd(tmp, x); } } return y; }
Lifework_xc 2018-05-03
  • 打赏
  • 举报
回复
引用 12 楼 cfjtaishan 的回复:
[quote=引用 8 楼 Lifework_xc 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 Lifework_xc 的回复:] 这是原题感觉很奇怪。。。
递归调用是不停的申请自身函数栈,从第一个函数栈申请到进入第二个函数栈,第一个函数栈并没有释放,因为第一个函数还没有执行完,就进入第二个(自身)函数栈。 当s1 < 100时,都会申请自身函数栈,上一个函数栈不释放。当s1 >= 100时,就会执行return n - 1;最后一个函数栈是s = 91, n 是7. s1 = s + n *n > 100,因此直接执行return n - 1;即返回6;然后回退到倒数第二个函数栈,此时s = 55, n = 6;由于return n -1;是else操作,s1 = s + n * n;小与100因此不会执行else直接返回,进入倒数第三个函数栈,同理s1 < 100;直接返回。后面的同理,知道最开始的函数栈。递归调用就是这样来的。 只有最后一个函数栈s = 91, n = 7时,s1 = s + n * n;才会>= 100;执行return n - 1;其他都是直接返回,不执行return n - 1;[/quote] 请问退栈的时候并没有return啊,怎么返回出去的?? 不应该是return fun(n1,s1);吗?[/quote] 但是你是func(n1, s1);并没有return func(n1, s1)呢。不要想当然哦,要看你的代码是否是这个逻辑。[/quote] 好吧 我再想想
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
好吧,想当然的就瞎说了哈哈,检讨检讨
weixin_42130693 2018-05-03
  • 打赏
  • 举报
回复
其实楼主只是没有搞明白,C++的标准给我们详细规定了在返回值为非空的函数里返回空将会导致未定义的行为,啥是未定义的行为呢,就是一切都有可能发生,也许会世界爆炸,也许是朝韩统一,也许是美国没有了
Lifework_xc 2018-05-03
  • 打赏
  • 举报
回复
引用 9 楼 phenix2009 的回复:
递归如果返回了,还怎么继续调用啊,递归其实就是不断重复调用自己,这时候不能返回,返回就停止了

= =麻烦你上机试试好伐?怎么不能return fun(s1,n1);了?

自信男孩 2018-05-03
  • 打赏
  • 举报
回复
引用 8 楼 Lifework_xc 的回复:
[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 Lifework_xc 的回复:] 这是原题感觉很奇怪。。。
递归调用是不停的申请自身函数栈,从第一个函数栈申请到进入第二个函数栈,第一个函数栈并没有释放,因为第一个函数还没有执行完,就进入第二个(自身)函数栈。 当s1 < 100时,都会申请自身函数栈,上一个函数栈不释放。当s1 >= 100时,就会执行return n - 1;最后一个函数栈是s = 91, n 是7. s1 = s + n *n > 100,因此直接执行return n - 1;即返回6;然后回退到倒数第二个函数栈,此时s = 55, n = 6;由于return n -1;是else操作,s1 = s + n * n;小与100因此不会执行else直接返回,进入倒数第三个函数栈,同理s1 < 100;直接返回。后面的同理,知道最开始的函数栈。递归调用就是这样来的。 只有最后一个函数栈s = 91, n = 7时,s1 = s + n * n;才会>= 100;执行return n - 1;其他都是直接返回,不执行return n - 1;[/quote] 请问退栈的时候并没有return啊,怎么返回出去的?? 不应该是return fun(n1,s1);吗?[/quote] 除了最后一个函数栈有返回,执行了return n-1;其他的都没执行,我上面已经说明的很清楚了。因为除了最后一个函数s1 >= 100之外,其他函数栈中s1 < 100;所以会继续执行func(n1, s1);但是func(n1, s1)后面没有代码可执行了,所以就退出函数栈了嘛
自信男孩 2018-05-03
  • 打赏
  • 举报
回复
引用 8 楼 Lifework_xc 的回复:
[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 Lifework_xc 的回复:] 这是原题感觉很奇怪。。。
递归调用是不停的申请自身函数栈,从第一个函数栈申请到进入第二个函数栈,第一个函数栈并没有释放,因为第一个函数还没有执行完,就进入第二个(自身)函数栈。 当s1 < 100时,都会申请自身函数栈,上一个函数栈不释放。当s1 >= 100时,就会执行return n - 1;最后一个函数栈是s = 91, n 是7. s1 = s + n *n > 100,因此直接执行return n - 1;即返回6;然后回退到倒数第二个函数栈,此时s = 55, n = 6;由于return n -1;是else操作,s1 = s + n * n;小与100因此不会执行else直接返回,进入倒数第三个函数栈,同理s1 < 100;直接返回。后面的同理,知道最开始的函数栈。递归调用就是这样来的。 只有最后一个函数栈s = 91, n = 7时,s1 = s + n * n;才会>= 100;执行return n - 1;其他都是直接返回,不执行return n - 1;[/quote] 请问退栈的时候并没有return啊,怎么返回出去的?? 不应该是return fun(n1,s1);吗?[/quote] 但是你是func(n1, s1);并没有return func(n1, s1)呢。不要想当然哦,要看你的代码是否是这个逻辑。
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
递归如果返回了,还怎么继续调用啊,递归其实就是不断重复调用自己,这时候不能返回,返回就停止了
Lifework_xc 2018-05-03
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
[quote=引用 4 楼 Lifework_xc 的回复:] 这是原题感觉很奇怪。。。
递归调用是不停的申请自身函数栈,从第一个函数栈申请到进入第二个函数栈,第一个函数栈并没有释放,因为第一个函数还没有执行完,就进入第二个(自身)函数栈。 当s1 < 100时,都会申请自身函数栈,上一个函数栈不释放。当s1 >= 100时,就会执行return n - 1;最后一个函数栈是s = 91, n 是7. s1 = s + n *n > 100,因此直接执行return n - 1;即返回6;然后回退到倒数第二个函数栈,此时s = 55, n = 6;由于return n -1;是else操作,s1 = s + n * n;小与100因此不会执行else直接返回,进入倒数第三个函数栈,同理s1 < 100;直接返回。后面的同理,知道最开始的函数栈。递归调用就是这样来的。 只有最后一个函数栈s = 91, n = 7时,s1 = s + n * n;才会>= 100;执行return n - 1;其他都是直接返回,不执行return n - 1;[/quote] 请问退栈的时候并没有return啊,怎么返回出去的?? 不应该是return fun(n1,s1);吗?
Lifework_xc 2018-05-03
  • 打赏
  • 举报
回复
引用 6 楼 phenix2009 的回复:
[quote=引用 4 楼 Lifework_xc 的回复:] 这是原题感觉很奇怪。。。
并没什么奇怪,你先搞明白递归的概念,递归是会返回值的,一旦返回值就停止了递归,这样理解就行了。[/quote] 为什么fun(n1,s1);那行没有return?不应该是return fun(n1,s1);吗? 没return你怎么返回给上层?
白色一大坨 2018-05-03
  • 打赏
  • 举报
回复
引用 4 楼 Lifework_xc 的回复:
这是原题感觉很奇怪。。。
并没什么奇怪,你先搞明白递归的概念,递归是会返回值的,一旦返回值就停止了递归,这样理解就行了。
自信男孩 2018-05-03
  • 打赏
  • 举报
回复
引用 4 楼 Lifework_xc 的回复:
这是原题感觉很奇怪。。。
递归调用是不停的申请自身函数栈,从第一个函数栈申请到进入第二个函数栈,第一个函数栈并没有释放,因为第一个函数还没有执行完,就进入第二个(自身)函数栈。 当s1 < 100时,都会申请自身函数栈,上一个函数栈不释放。当s1 >= 100时,就会执行return n - 1;最后一个函数栈是s = 91, n 是7. s1 = s + n *n > 100,因此直接执行return n - 1;即返回6;然后回退到倒数第二个函数栈,此时s = 55, n = 6;由于return n -1;是else操作,s1 = s + n * n;小与100因此不会执行else直接返回,进入倒数第三个函数栈,同理s1 < 100;直接返回。后面的同理,知道最开始的函数栈。递归调用就是这样来的。 只有最后一个函数栈s = 91, n = 7时,s1 = s + n * n;才会>= 100;执行return n - 1;其他都是直接返回,不执行return n - 1;
Lifework_xc 2018-05-03
  • 打赏
  • 举报
回复


这是原题感觉很奇怪。。。
AlbertS 2018-05-03
  • 打赏
  • 举报
回复
第二个程序是对的,第一个程序的6没有返回到最上层,这种写法的结果是未定义的,如果输出的结果是6,只能是赶巧了,
qq_40162781 2018-05-03
  • 打赏
  • 举报
回复
肯定用第二个拉
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧