免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2590 | 回复: 4
打印 上一主题 下一主题

[函数] 为何这个递归函数无法终止? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-11 17:36 |只看该作者 |倒序浏览
问题:
为何这个递归无法终止?

int bad
Bad (unsigned int N)
{
        if ( N == 0 )
                return 0;
        else
                return Bad (N / 3 + 1) + N -1;
}

书上的解释看的似懂非懂,谁能给小弟我用通俗的语言解释一下到底是哪里的问题?

论坛徽章:
0
2 [报告]
发表于 2007-09-11 17:40 |只看该作者
当N>=0时, (N / 3 + 1)  == 0 这个条件什么时候能够满足?

论坛徽章:
0
3 [报告]
发表于 2007-09-11 17:40 |只看该作者
无符号整型的N
在这个运算(N/3+1)情况下不可能为0

论坛徽章:
0
4 [报告]
发表于 2007-09-11 18:03 |只看该作者
原帖由 niexinnm 于 2007-9-11 17:36 发表
问题:
为何这个递归无法终止?

int bad
Bad (unsigned int N)
{
        if ( N == 0 )
                return 0;
        else
                return Bad (N / 3 + 1) + N -1;
}

书上的解释看的似懂非懂,谁能给小弟我用通俗的语言解释 ...


unsigned int 的取值范围是 0 ~ 4294967295, 如果你传入一个负数, 他系统会帮你转换成前面那个范围内的某个数.
你的程序退出条件是: N为0. 但是, 如果最开始调用BAD时传入的参数不为0, 那么每次递归时的参数(N/3+1) 始终大于 1, 永远都到不了退出递归到条件.

论坛徽章:
0
5 [报告]
发表于 2007-09-11 19:33 |只看该作者
原帖由 web_surf 于 2007-9-11 18:03 发表


unsigned int 的取值范围是 0 ~ 4294967295, 如果你传入一个负数, 他系统会帮你转换成前面那个范围内的某个数.
你的程序退出条件是: N为0. 但是, 如果最开始调用BAD时传入的参数不为0, 那么每次递归时的参 ...


十分感谢!我也想到Bad不可能为0,那本书不知道是不是翻译的问题,解释的让我心慌,谢谢大大的详细解释!也多谢上面的各位了!小弟是新手,希望大家能帮助我学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP