BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #50836同步于 2011/4/4
CPP机器人发帖

[合集] 求指点,递归函数结束条件

shenlei
2011/4/4镜像同步0 回复
☆─────────────────────────────────────☆ tingyang (奔跑中的肉夹馍) 于 (Tue Mar 22 23:23:16 2011) 提到: void f(int n) { printf("%d\n",n); n/(1000-n); f(n+1); } 调用: f(0)输出一串数字。这个函数为什么更够运行呢?n/(1000-n)结果为什么的时候退出呢? ☆─────────────────────────────────────☆ fentoyal (长风长歌) 于 (Wed Mar 23 07:58:37 2011) 提到: 【 在 tingyang 的大作中提到: 】 : void f(int n) : { : printf("%d\n",n); : ................... 能运行因为他没任何语法错误。 但是跑起来就停不住了。。 而且,那句n/(1000-n)没有任何意义,因为没有赋值。 ***************************************************************** 爬了下楼,看见楼下有说因为除0异常停止的。这是不对的,因为C++标准不认为除0异常,也不进行捕获,更谈不上除0异常退出。 所以理论上这是死循环。 会停下(其实是报错abort),因为用的是递归,每次递归调用,函数是要压栈的,返回地址,ebp,参数,等等根据系统不同,压栈的东西多少不一。所以递归一段时间就栈溢出了。 然后就abort了。 如果做成循环 void f(int n) { while( ++n) { printf("%d\n",n); n/(1000-n); } // f(n+1); } 就不会停了。 ☆─────────────────────────────────────☆ houxh912 (sniffer) 于 (Wed Mar 23 08:17:32 2011) 提到: n=1000的时候,发生除0异常,递归就结束了,开始返回~~~ ☆─────────────────────────────────────☆ iam19891211 (【洛阳亲友如相问】 【就说我在学六楼】) 于 (Wed Mar 23 08:45:06 2011) 提到: 赞 ☆─────────────────────────────────────☆ gootyking (『热情一顶乐团』团长|回帖终结者A1) 于 (Wed Mar 23 08:58:10 2011) 提到: 恩 【 在 houxh912 (sniffer) 的大作中提到: 】 : n=1000的时候,发生除0异常,递归就结束了,开始返回~~~ ☆─────────────────────────────────────☆ iam19891211 (【洛阳亲友如相问】 【就说我在学六楼】) 于 (Wed Mar 23 09:09:40 2011) 提到: 在机器上跑出来的返回值有点看不懂啊,求指点 【 在 houxh912 的大作中提到: 】 : n=1000的时候,发生除0异常,递归就结束了,开始返回~~~ : -- ☆─────────────────────────────────────☆ shisiyuan (unbelievable) 于 (Wed Mar 23 09:10:35 2011) 提到: 赞 ☆─────────────────────────────────────☆ Bogdanfan (bogdan) 于 (Wed Mar 23 09:22:14 2011) 提到: en n/n-1000就是结束条件 ☆─────────────────────────────────────☆ xinguohenan (小水) 于 (Wed Mar 23 09:27:15 2011) 提到: 十大一定 ☆─────────────────────────────────────☆ gootyking (『热情一顶乐团』团长|回帖终结者A1) 于 (Wed Mar 23 09:29:31 2011) 提到: 十大了哇 【 在 xinguohenan (小水) 的大作中提到: 】 : 十大一定 ☆─────────────────────────────────────☆ icepig (我不是ICEPIG) 于 (Wed Mar 23 09:31:54 2011) 提到: 泪目啊 看到C/C++版十大 ☆─────────────────────────────────────☆ littlefly (小苍) 于 (Wed Mar 23 09:32:17 2011) 提到: 不知道lz是什么环境,如果是unix like的系统的话,除以0进程会收到一个表示浮点运算错误的信号SIGFPE ,如果没有对此信号进行捕获的话,程序对此信号的处理一般是直接结束而不是返回,并生成core文件,你可以在一个程序里调用一下,然后再在调用后面随便打印点东西,看这个东西是不是会被打印出来,以验证是函数返回还是程序退出 ☆─────────────────────────────────────☆ Bogdanfan (bogdan) 于 (Wed Mar 23 09:32:29 2011) 提到: 哇哇哇 十大十大 ☆─────────────────────────────────────☆ tingyang (奔跑中的肉夹馍) 于 (Wed Mar 23 09:38:09 2011) 提到: 能停止啊!调用f(0)的话就输出到4720就结束了。你运行的结果不是这样么? 【 在 fentoyal 的大作中提到: 】 : : void f(int n) : : { : : printf("%d\n",n); : ................... ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Wed Mar 23 09:38:57 2011) 提到: 那啥,咋每天早上都能上个10呢...浮云啊... ☆─────────────────────────────────────☆ tingyang (奔跑中的肉夹馍) 于 (Wed Mar 23 09:48:43 2011) 提到: 程序运行4720次,然后直接退出而不是返回 【 在 littlefly 的大作中提到: 】 : 不知道lz是什么环境,如果是unix like的系统的话,除以0进程会收到一个表示浮点运算错误的信号SIGFPE ,如果没有对此信号进行捕获的话,程序对此信号的处理一般是直接结束而不是返回,并生成core文件,你可以在一个程序里调用一下,然后再在调用后面随便打印点东西,看这个东西是不是会被打印出来,以验证是函数返回还是程序退出 : -- ☆─────────────────────────────────────☆ iam19891211 (【洛阳亲友如相问】 【就说我在学六楼】) 于 (Wed Mar 23 09:52:18 2011) 提到: 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回 所以,个人猜测导致这个递归结束的原因是堆栈段溢出而不是除零溢出吧 ☆─────────────────────────────────────☆ lixunhuan (李寻欢) 于 (Wed Mar 23 10:07:33 2011) 提到: 估计涉及到C++对于除零 异常的处理. 在 debug版本下测试是会运行到某一个数值比如5712 左右推出. 但是在release 版本中到了 2W+依然没有出错.. 【 在 iam19891211 的大作中提到: 】 : 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊 : 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回 : 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回 : ................... ☆─────────────────────────────────────☆ txmm (你被tx啦!) 于 (Wed Mar 23 10:10:43 2011) 提到: 十大?太虎了把 ☆─────────────────────────────────────☆ froglian (青蛙连) 于 (Wed Mar 23 10:22:49 2011) 提到: 十大啊……泪奔啊…… ☆─────────────────────────────────────☆ stfairy (大真似伪、大爱无疆的小楼主) 于 (Wed Mar 23 10:27:32 2011) 提到: 【 在 iam19891211 的大作中提到: 】 : 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊 : 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回 : 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回 : ................... re,这个ms靠谱 ☆─────────────────────────────────────☆ coolfantasy (Cool) 于 (Wed Mar 23 10:41:22 2011) 提到: 编译器如果做了尾递归优化,还真有可能不会栈溢出 有除零的风险 ☆─────────────────────────────────────☆ shuimu1027 (【绝望团的绝唱】||【水母倍儿sui???】) 于 (Wed Mar 23 11:08:31 2011) 提到: 没有赋值就没有向内存中存放数据,所以可以说“n/(1000-n)”没有执行 ☆─────────────────────────────────────☆ liudq3888 (哥帅不) 于 (Wed Mar 23 11:17:36 2011) 提到: 【 在 shuimu1027 的大作中提到: 】 : 没有赋值就没有向内存中存放数据,所以可以说“n/(1000-n)”没有执行 : -- 是这样的吗? ☆─────────────────────────────────────☆ dawnc (9527) 于 (Wed Mar 23 11:24:19 2011) 提到: 退出的原因是不是与程序栈空间的大小有关,一般程序默认栈空间是2MB,改一下这个大小,看退出时输出的数据是不是有变化。 ☆─────────────────────────────────────☆ lenevo (legend) 于 (Wed Mar 23 11:25:43 2011) 提到: 十大 ☆─────────────────────────────────────☆ b78859793 (neji) 于 (Wed Mar 23 11:47:44 2011) 提到: 这是很多年前看到的一个题目了。 不用判断循环输出1~1000个数,我当时在VC6下试过是输出到1000跳出来的啊- - 从0开始输入会有什么不同吗 ☆─────────────────────────────────────☆ shuimu1027 (【绝望团的绝唱】||【水母倍儿sui???】) 于 (Wed Mar 23 12:41:11 2011) 提到: 一赋值就可以看到到一千报异常了 ☆─────────────────────────────────────☆ suyulin (编个昵称好麻烦……) 于 (Wed Mar 23 18:00:15 2011) 提到: C运行了一下发现是在堆栈溢出的时候出core 为什么没有在1000的时候core出是因为计算结果没有赋值,所以进行了优化,没有进行除法操作。 【 在 fentoyal (长风长歌) 的大作中提到: 】 : 能运行因为他没任何语法错误。 : 但是跑起来就停不住了。。 : 而且,那句n/(1000-n)没有任何意义,因为没有赋值。 : ................... ☆─────────────────────────────────────☆ icicle (凌次方) 于 (Wed Mar 23 18:42:10 2011) 提到: 赞~ 【 在 iam19891211 的大作中提到: 】 : 如果N=1000时溢出,那输出不是应该是0到1000么。。。为啥我的不是呢,有没有人指点一下啊 : 在程序调用后的打印命令不会被执行,所以是程序退出而不是函数返回 : 把n/n-1000注释掉之后,发现程序仍然能够结束,而且是程序退出而不是函数返回 : ................... ☆─────────────────────────────────────☆ sniffer (猪) 于 (Wed Mar 23 18:56:33 2011) 提到: 优化 优化 优化 ☆─────────────────────────────────────☆ Beatrix (Beatrix) 于 (Thu Mar 24 16:56:26 2011) 提到: 编译器会优化的,那句话没意义,编译后的程序就没那句话。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。