zoukankan      html  css  js  c++  java
  • java算法:递归算法

    java算法:递归算法

    递归算法时通过解决相同问题的一个或几个小例子来解决问题的算法。在java中,实现递归方法就是调用自身的方法。

    例1:阶乘函数递归实现

    Java代码 复制代码
    1. static int factorial(int n){   
    2.     if(n == 0){   
    3.         return 1;   
    4.     }   
    5.     return n * factorial(n - 1);   
    6. }  

    Java代码 复制代码
    1. for(t = 1, i = 1; i <=N; i++){   
    2.     t *= i;   
    3. }  

    是等价的,一个递归程序总可以转换成执行相同计算的非递归程序。同样,可以用递归来表示设计循环的任何计算。使用递归能以简洁的形式表达复杂的算法,且不失效率。如:阶乘函数的递归实现可以避免使用局部变量。递归的开销在于编程系统中支持方法调用的机制,它使用了一个等同的内嵌堆栈。

    例2:可疑的递归程序

    Java代码 复制代码
    1. static int puzzle(int n){   
    2.     if(n == 1){   
    3.         return 1;   
    4.     }   
    5.     if(n % 2 == 0){   
    6.         return puzzle(n/2);   
    7.     }else{   
    8.         return puzzle(3 * n + 1);   
    9.     }   
    10. }  

    与阶乘函数递归实现相比,这个是不能证明的。但是,该程序确实可以终止的。

    例3:欧几里得算法

    Java代码 复制代码
    1. static int gcd(int m, int n){   
    2.     if(n == 0){   
    3.         return m;   
    4.     }   
    5.     return gcd(n, m%n);   
    6. }  

    对于欧几里得算法,递归的深度取决于参数的算术性质(已知是对数级的)。

    例4:对前缀表达式求值的递归程序

    Java代码 复制代码
    1. static char[] a;   
    2. static int i;   
    3. static int eval(){   
    4.     int x = 0;   
    5.     while(a[i] == ' '){   
    6.         i++;   
    7.     }   
    8.     if(a[i] == '+'){   
    9.         i++;   
    10.         return eval() + eval();   
    11.     }   
    12.     if(a[i] == '*'){   
    13.         i++;   
    14.         return eval() * eval();   
    15.     }   
    16.     while((a[i] >= '0')&&(a[i]<= '9')){   
    17.         x = 10 * x + (a[i++] - '0');   
    18.     }   
    19.     return x;   
    20. }  

    原则上,可用对等的递归程序代替人任何for循环。但通常,用递归程序来表达运算比for循环更自然。递归的深度是指在整个运算过程中方法调用的最大的嵌套次数。

    例5:链表递归函数

    简单的链表处理任务可以使用递归方式,但可能不试用于巨型链表,因为递归的深度可能与链表的长度成比例。

    Java代码 复制代码
    1. int count(Node h){   
    2.     if(h == null){   
    3.         return 0;   
    4.     }   
    5.     return 1 + count(h.next);   
    6. }   
    7. void traverse(Node h){   
    8.     if(h == null){   
    9.         reurn;   
    10.     }   
    11.     h.item.visit();   
    12.     travrese(h.next);   
    13. }   
    14. void traverseR(Node h){   
    15.     if(h == null){   
    16.         reurn;   
    17.     }   
    18.     travreseR(h.next);   
    19.     h.item.visit();   
    20. }   
    21. Node remove(Node h, Item v){   
    22.     if(h == null){   
    23.         return null;   
    24.     }   
    25.     if(eq(h.item,v)){   
    26.         return remove(h.next,v);   
    27.     }   
    28.     h.next = remove(h.next,v);   
    29.     return h;   
    30. }  
  • 相关阅读:
    【转并修改】VS2013 MVC Web项目使用内置的IISExpress支持局域网内部机器(手机、PC)访问、调试
    ASP.NET MVC4 UEditor 的上传图片配置路径
    转:Java图形化界面设计——布局管理器之FlowLayout(流式布局)其他请参考转载出处网址
    转载:win7JDK环境配置
    转载:java保留2位小数
    转载:遍历Map的四种方法
    架构模式: 远程过程调用
    架构模式: 外部配置化
    架构模式: 微服务的基底
    架构模式: 服务部署平台
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301147.html
Copyright © 2011-2022 走看看