Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 692|回复: 0

[算法学习]尾递归及示例(JAVA)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-28 00:06:03 | 显示全部楼层 |阅读模式
    1. /**  
    2. * java version "1.6.0_17"
    3.   
    4. * 尾递归与迭代实现具有相当的性能;
    5.   
    6. * 缓存实现的性能略高于非尾递归实现;
    7.   
    8. * 递归:recursive  尾递归:tail recursive;
    9.   
    10. * 尾递归时不需保存方法调用栈的参数及返回结果;于是申请的栈帧会被及时回收  
    11. */  
    12. public class TestFibo {   
    13.   //斐波那契数列是从第0项和第1项开始,之后的项等于其前面相邻两项之和。
    14.   //0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,......
    15.     public static void main(String[] args) {   
    16.         System.out.println(fibo3(11));
    17.         int N=10;   
    18.         long begin=System.currentTimeMillis();         
    19.         System.out.println(fibo1(N)); //fibo1   
    20.         System.out.println(System.currentTimeMillis()-begin);   
    21.            
    22.         begin=System.currentTimeMillis();   
    23.         System.out.println(fibo2(N)); //fibo2   
    24.         System.out.println(System.currentTimeMillis()-begin);   
    25.            
    26.         begin=System.currentTimeMillis();   
    27.         System.out.println(fibo3(N)); //fibo3   
    28.         System.out.println(System.currentTimeMillis()-begin);   
    29.            
    30.         begin=System.currentTimeMillis();   
    31.         System.out.println(fibo4(N)); //fibo4   
    32.         System.out.println(System.currentTimeMillis()-begin);   
    33.     }   
    34.     //1.1 非尾递归实现(书本上经常出现)   
    35.     public static long fibo1(long n){   
    36.         if(n<2) return n;   
    37.         return fibo1(n-1)+fibo1(n-2); //小心栈溢出   
    38.     }  

    39.     //1.2 缓存实现(JS good part里有过介绍)   
    40.     public static int LENGTH=30; //过大了就会占用过多空间   
    41.     public static long[] cache=new long[LENGTH];   
    42.     public static long fibo2(int n){   
    43.         if(n<2) return n;   
    44.         if(n>=LENGTH){   
    45.             return fibo4(n-1)+fibo4(n-2);   
    46.         }else if(cache[n]==0){   
    47.             cache[n]=fibo4(n-1)+fibo4(n-2); //减少重复计算               
    48.         }   
    49.         return cache[n];   
    50.     }   
    51.     //1.3 迭代实现   
    52.     public static long fibo3(long n){   
    53.         if(n<2) return n;   
    54.         long pre=1,prepre=1,ret=1;   
    55.         for(int i=2;i< n;i++){   
    56.             ret=pre+prepre;   
    57.             prepre=pre;   
    58.             pre=ret;   
    59.         }   
    60.         return ret;   
    61.     }   
    62.     //1.4 尾递归实现   
    63.     public static long fibo4(int n){   
    64.         if(n< 2) return n;   
    65.         return fibo2Helper(n, 1, 1, 3); //保持与非尾递归接口不变,是借助帮助方法实现尾递归的   
    66.     }   
    67.     private static long fibo2Helper(int n,long prepre,long pre,int begin){   
    68.         if(n==begin) return pre+prepre;   
    69.         return fibo2Helper(n, pre, prepre+pre, ++begin);    //这里相当于迭代实现for-loop的浓缩     
    70.     }   
    71.       
    72.     //----------------------尾递归的其他实现-------------------------------------->   
    73.     //2. 求最大公约数   
    74.     public static int gcd(int big,int small){   
    75.         if(big%small==0) return small;   
    76.         return gcd(small, big%small);   
    77.     }   
    78.     //3.1 阶乘--非尾递归   
    79.     public static int fn1(int n){   
    80.         if(n< 2) return 1;   
    81.         return n*fn1(n-1);   
    82.     }   
    83.     //3.2 阶乘--尾递归   
    84.     public static int fn2(int n){   
    85.         if(n< 2) return 1;   
    86.         return fn2Helper(1, n);   
    87.     }   
    88.     private static int fn2Helper(int ret, int n){   
    89.         if(n< 2) return ret;   
    90.         return fn2Helper(ret*n,n-1);   
    91.     }   
    92.         //4.1 翻转字符串--非尾递归   
    93.        public static String reverse1(String s, int length){   
    94.             if(length==0) return ""; //下一行的"+"可借助高版本JDK编译器的优化   
    95.             return s.charAt(length-1)+reverse1(s,length-1);   
    96.         }   
    97.        //4.2 翻转字符串--尾递归   
    98.        public static String reverse2(String s){   
    99.            return reverse2Helper(s, "", s.length());   
    100.        }   
    101.        private static String reverse2Helper(String s,String init,int len){   
    102.            if(len==0) return init;   
    103.            return reverse2Helper(s, init+s.charAt(len-1), len-1);   
    104.        }   
    105.     //5. 验证字符串是否是回文 testHuiwen("abcdcba")   
    106.      public static boolean testHuiwen(String s){   
    107.          return testHuiwenHelper(s, 0, s.length());   
    108.      }   
    109.      private static boolean testHuiwenHelper(String s,int begin, int len){   
    110.          if(begin< len>>1 && s.charAt(begin)==s.charAt(len-begin-1))   
    111.              return testHuiwenHelper(s, begin+1, len);   
    112.          else if(begin==len>>1) return true;   
    113.          else return false;   
    114.      }   
    115.     //6. 翻转整数 如:1024=>4201   
    116.      public static int reverseInt(int i){   
    117.          return reverseIntHelper(i, 0);   
    118.      }   
    119.      private static int reverseIntHelper(int i, int init){   
    120.          if(i==0) return init;   
    121.          return reverseIntHelper(i/10, init*10+i%10);   
    122.      }   
    123. }  
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/28/000603093.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:37 , Processed in 0.298420 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表