主题:我对这个递归实在是不太理解。请热心人帮忙解释一下
南月
[专家分:590] 发布于 2005-10-11 11:56:00
program test1;
var n:integer;
function count(n:integer):integer;
begin
if n=1 then count:=0
else
if n mod 2=0 then count:=count(n div 2)+1
else count:=count(n*3+1)+1;
end;
begin
readln(n);
writeln(count(n));
end.
输入:99
输出:
为什么会输出25。我对这个递归实在是不太理解。请热心人帮忙解释一下
回复列表 (共10个回复)
沙发
boxertony [专家分:23030] 发布于 2005-10-11 13:43:00
1 (n=1)
count(n) = count(n/2)+1 (n为偶数)
count(n*3+1)+1(n为奇数,且n<>1)
板凳
KID [专家分:820] 发布于 2005-10-11 13:46:00
不会吧,如果输入99,那么由于不可整除2所以直接在函数中跳到else count:=count(n*3+1)+1这句执行,怎么会25
3 楼
boxertony [专家分:23030] 发布于 2005-10-11 14:32:00
下面还会继续递归下去啊,3n+1肯定是偶数,这样就会除以2啊
4 楼
KID [专家分:820] 发布于 2005-10-11 19:43:00
哦,8好意思,看错了
把mod当成div来用了
5 楼
天空飞雪 [专家分:960] 发布于 2005-10-11 20:49:00
很容易,跟踪一下,就能理解了。。。。。
6 楼
rzysl [专家分:0] 发布于 2005-10-12 20:14:00
我看的懂,但是不知道这个递归到底有什么规律!
也就是如何才能快速找到n在进过若干次递归后,回出现n=2的k次,这样就可以出来递归结果!
可是,我不理解,怎么才能找到这个数
7 楼
天空飞雪 [专家分:960] 发布于 2005-10-12 20:33:00
规律,不好找呀。。。。
8 楼
流氓兔 [专家分:140] 发布于 2005-10-13 17:46:00
这一个程序我也在这里发过,不过我后来一看的确很简单,
var n:integer;
function count(n:integer):integer;
begin
if n=1 then xount:=0 else
if n mod 2=0 then count(n div 2)+1 else
count:=count(n*3+1)+1;
end;
begin
readln(n);
writeln(count(n));
end.
只要是当N为奇数时,把N*3+1,得到的一个值再代入COUNT进行运算。当N为偶数时N DIV 2然后再来运算。直到N=1.........
9 楼
流氓兔 [专家分:140] 发布于 2005-10-13 17:48:00
再加一句,总共进行了25次运算。故最后的值为25
10 楼
LZR2005 [专家分:110] 发布于 2005-10-14 20:56:00
总共进行了25次运算,因为程序中有count(n div 2)"+1" count:=count(n*3+1)"+1";
所以是递增的,从下面倒推上去就是1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
我来回复