递归小感

来源:互联网 发布:网络购物法律法规 编辑:程序博客网 时间:2024/04/28 19:58

写了一个验证谷角猜想的小程序,本来是用循环方法写的,交给老师之后,让我改成递归方法。

我一想,不就是把核心函数拷过来,把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、递归方法的时间和空间复杂度都比较高

0 0
原创粉丝点击