回 帖 发 新 帖 刷新版面

主题:我对这个递归实在是不太理解。请热心人帮忙解释一下

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个回复)

沙发

1  (n=1)
count(n) =   count(n/2)+1  (n为偶数)
             count(n*3+1)+1(n为奇数,且n<>1)

板凳

不会吧,如果输入99,那么由于不可整除2所以直接在函数中跳到else count:=count(n*3+1)+1这句执行,怎么会25

3 楼

下面还会继续递归下去啊,3n+1肯定是偶数,这样就会除以2啊

4 楼

哦,8好意思,看错了
把mod当成div来用了

5 楼

很容易,跟踪一下,就能理解了。。。。。

6 楼

我看的懂,但是不知道这个递归到底有什么规律!
也就是如何才能快速找到n在进过若干次递归后,回出现n=2的k次,这样就可以出来递归结果!
可是,我不理解,怎么才能找到这个数

7 楼

规律,不好找呀。。。。

8 楼

这一个程序我也在这里发过,不过我后来一看的确很简单,
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 楼

再加一句,总共进行了25次运算。故最后的值为25

10 楼

总共进行了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

我来回复

您尚未登录,请登录后再回复。点此登录或注册