写了一个验证谷角猜想的小程序,本来是用循环方法写的,交给老师之后,让我改成递归方法。
我一想,不就是把核心函数拷过来,把while改成return方法自身就行了嘛。。。
结果运行出错。。。
看了看算法书,专门研究了递归之后,才发现,原来是没有出口啊!
所谓没有出口,也就是指,递归函数必须要满足一个要求,就是,必须有一个非递归定义的初始值,诸位千万别小看这一点,也许你看我现在的代码,感觉到非常容易,但是当真的去思考的时候,才发现敲代码时,如果没有专门朝着一方面考虑,很难考虑到这一点。
原核心函数(循环方法当中的):
if(n%2==0)
{
System.out.print("上次偶数:");
n=n/2;
if(n==1)
{
System.out.println("最终结果为:");
}
System.out.print(n+" ");
}
else
{
System.out.print("上次奇数:");
n=n*3+1;
if(n==1)
{
System.out.println("最终结果为:");
}
System.out.print(n+" ");
}
改进后的核心函数递归方法当中的:
if(n%2==0)
{
System.out.print("上次偶数:");
n=n/2;
if(n==1)
{
System.out.println("最终结果为:");
System.out.print(n+" ");
return 1;
}
System.out.print(n+" ");
return diguiProc(n);
}
else
{
System.out.print("上次奇数:");
n=n*3+1;
if(n==1)
{
System.out.println("最终结果为:");
System.out.print(n+" ");
return 1;
}
System.out.print(n+" ");
return diguiProc(n);
}
另外补充一点,书上说的,递归方法的使用对象一定具有递归性在数学上是指:一定能够用一个数学表达式表示出递归关系
递归三特点:1、每个递归函数都必须有一个非递归定义的初始值,作为递归结束的标志,或递归结束的出口;2、问题具有递归性;3、递归方法的时间和空间复杂度都比较高