为了账号安全,请及时绑定邮箱和手机立即绑定

递归输出问题

递归输出问题

C C++
心雨翎馨 2017-03-17 20:58:59
#include<stdio.h> int fun(int m,int n) { if(n==0) return m; printf("     qwef\n"); fun(n,m%n); printf("    xvb\n"); } void main() { int m=45,n=15; printf("%d",fun(m,n)); } 这样的输出结果就是      qwef     xvb 8 如果改变数中第二个printf则 #include<stdio.h> int fun(int m,int n) { if(n==0) return m; printf("     qwef\n"); fun(n,m%n); printf("   127587825\n"); } void main() { int m=45,n=15; printf("%d",fun(m,n)); } 这样的输出结果就是      qwef    127587825 13
查看完整描述

4 回答

?
墨以所生

TA贡献4条经验 获得超1个赞

fun函数中fun(n,m);应该在主函数中用来取返回值或者调用的。比如Num=fun(n,m); 还有fun应该加一个返回值return 变量名;
查看完整回答
1 反对 回复 2017-03-18
?
半枯

TA贡献101条经验 获得超45个赞

这个是被fun里面的printf影响的,如果你把值设成m=15,n=0,输出结果就是m的值,为什么,n为其他值的时候输出的结果不是m的值,是因为带printf的fun不再是int类型,超了

查看完整回答
反对 回复 2017-03-18
?
慕粉2104107182

TA贡献1条经验 获得超0个赞

返回值不应该是15吗,而且应该在两个输出句中间。不懂啊
查看完整回答
反对 回复 2017-03-18
?
墨以所生

TA贡献4条经验 获得超1个赞

呃,我有点不明白你想要做什么
查看完整回答
反对 回复 2017-03-18
?
__YXQ__

TA贡献48条经验 获得超15个赞

递归后的输出语句未知的影响了函数的返回值,想了很久也不知道为什么,楼主知道了麻烦告诉我一声哈

查看完整回答
反对 回复 2017-03-18
  • 心雨翎馨
    心雨翎馨
    我也很想知道。我问老师的老师没回我伤心T_T
  • 朕日理万机
    朕日理万机
    参见我的回答,因为用了对零取余这种未定义行为。。。其实你要自己运行一下这个程序,可能既不是8也不是13。
?
心雨翎馨

TA贡献3条经验 获得超0个赞

为什么会这样?我只是改变了一个输出语句

查看完整回答
反对 回复 2017-03-17
?
朕日理万机

TA贡献27条经验 获得超28个赞

咦,我昨天好像回答过一次了,m%n,当n=0时是未定义行为,结果不可预测,跟你运行时内存里的情况有关。所以源代码里稍微改一下,就可能对运行时的内存产生影响,就会产生完全不一样的结果。所以不管是8,还是13,都是一种巧合。

查看完整回答
反对 回复 2017-03-19
  • 心雨翎馨
    心雨翎馨
    可是当我不加函数中的第二个printf语句是这个程序结果都是对的这又是为什么
  • 朕日理万机
    朕日理万机
    目测你是要用辗转相除法求最大公约数?45和15的最大公约数是15,你一个输出8,一个输出13,都不对啊。退一步说即使有某个巧合是输出了15,那也是因为那片内存曾经放过一个15,后来该内存被释放了,值留在了那里,然后你的未定义的结果碰巧用那个值当结果了,仍然是个巧合。
  • 朕日理万机
    朕日理万机
    哎呀不好意思我看错了,问题不在取余,我重新回复一下。。。
  • 4 回答
  • 0 关注
  • 2312 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信