+ -
当前位置:首页 → 问答吧 → 关于递归的

关于递归的

时间:2011-11-28

来源:互联网

int fun(int n)
{if(n>1)return 1;
else return n*fun(n*2)
}
为什么这个不是正确的递归函数

作者: tingfengx   发布时间: 2011-11-28


你这个n为负数的话,那就死了

作者: qscool1987   发布时间: 2011-11-28

因为n起始<=1的时候就是无限递归了。

作者: pengzhixi   发布时间: 2011-11-28

因为 n = -1 时,没有结束语句了 fun(-1) 回去找fun(-2) 而 fun(-2)回去找 fun(-4)

n == 0 时, 直接因找自身而死循环

n >= 1 时正确

作者: mougaidong   发布时间: 2011-11-28

就是说正确的递归必须所有的情况都满足,不能只满足一部分?

作者: tingfengx   发布时间: 2011-11-28

n<=1时无穷递归,没有退出的出口。可以加上下界控制。
C/C++ code

int fun(int n)
{
   if(n>1 | n < 某个负数)return 1;
   else 
      return n*fun(n*2)
}

作者: xingfeng2510   发布时间: 2011-11-28

引用 4 楼 tingfengx 的回复:

就是说正确的递归必须所有的情况都满足,不能只满足一部分?

当然,递归必须是有限次调用,并且至少有一个出口。

作者: xingfeng2510   发布时间: 2011-11-28

递归的定义:
对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。
具体的就是说,必须有一个或有限几个初值并能使其他值能最终收敛到这个初值上来!!
递归一般有一个递推公式而来。


对于楼主的程序,有两个问题!
1.初值不明确,应该改成 if(n==0) return 1;
2. 在递归部分,当n>1时,f(n*2)总是大于f(n)呈现发散而非收敛
稍微修改后的程序为:

C/C++ code

#include <iostream>

int fun(int n)
{
if(n==1)return 1;
else
return n*fun(n/2);
};

int main()
{
 cout<<fun(15)<<endl;
 
}



仅供参考!!


作者: timerfire   发布时间: 2011-11-30