尾递归及示例(JAVA)

/** * java version "1.6.0_17"
* 尾递归与迭代实现具有相当的性能;
* 缓存实现的性能略高于非尾递归实现;
* 递归:recursive 尾递归:tail recursive;
* 尾递归时不需保存方法调用栈的参数及返回结果;于是申请的栈帧会被及时回收 */ public class TestFibo { //斐波那契数列是从第0项和第1项开始,之后的项等于其前面相邻两项之和。 //0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,...... public static void main(String[] args) { System.out.println(fibo3(11)); int N=10; long begin=System.currentTimeMillis(); System.out.println(fibo1(N)); //fibo1 System.out.println(System.currentTimeMillis()-begin); begin=System.currentTimeMillis(); System.out.println(fibo2(N)); //fibo2 System.out.println(System.currentTimeMillis()-begin); begin=System.currentTimeMillis(); System.out.println(fibo3(N)); //fibo3 System.out.println(System.currentTimeMillis()-begin); begin=System.currentTimeMillis(); System.out.println(fibo4(N)); //fibo4 System.out.println(System.currentTimeMillis()-begin); } //1.1 非尾递归实现(书本上经常出现) public static long fibo1(long n){ if(n<2) return n; return fibo1(n-1)+fibo1(n-2); //小心栈溢出 } //1.2 缓存实现(JS good part里有过介绍) public static int LENGTH=30; //过大了就会占用过多空间 public static long[] cache=new long[LENGTH]; public static long fibo2(int n){ if(n<2) return n; if(n>=LENGTH){ return fibo4(n-1)+fibo4(n-2); }else if(cache[n]==0){ cache[n]=fibo4(n-1)+fibo4(n-2); //减少重复计算 } return cache[n]; } //1.3 迭代实现 public static long fibo3(long n){ if(n<2) return n; long pre=1,prepre=1,ret=1; for(int i=2;i< n;i++){ ret=pre+prepre; prepre=pre; pre=ret; } return ret; } //1.4 尾递归实现 public static long fibo4(int n){ if(n< 2) return n; return fibo2Helper(n, 1, 1, 3); //保持与非尾递归接口不变,是借助帮助方法实现尾递归的 } private static long fibo2Helper(int n,long prepre,long pre,int begin){ if(n==begin) return pre+prepre; return fibo2Helper(n, pre, prepre+pre, ++begin); //这里相当于迭代实现for-loop的浓缩 } //----------------------尾递归的其他实现--------------------------------------> //2. 求最大公约数 public static int gcd(int big,int small){ if(big%small==0) return small; return gcd(small, big%small); } //3.1 阶乘--非尾递归 public static int fn1(int n){ if(n< 2) return 1; return n*fn1(n-1); } //3.2 阶乘--尾递归 public static int fn2(int n){ if(n< 2) return 1; return fn2Helper(1, n); } private static int fn2Helper(int ret, int n){ if(n< 2) return ret; return fn2Helper(ret*n,n-1); } //4.1 翻转字符串--非尾递归 public static String reverse1(String s, int length){ if(length==0) return ""; //下一行的"+"可借助高版本JDK编译器的优化 return s.charAt(length-1)+reverse1(s,length-1); } //4.2 翻转字符串--尾递归 public static String reverse2(String s){ return reverse2Helper(s, "", s.length()); } private static String reverse2Helper(String s,String init,int len){ if(len==0) return init; return reverse2Helper(s, init+s.charAt(len-1), len-1); } //5. 验证字符串是否是回文 testHuiwen("abcdcba") public static boolean testHuiwen(String s){ return testHuiwenHelper(s, 0, s.length()); } private static boolean testHuiwenHelper(String s,int begin, int len){ if(begin< len>>1 && s.charAt(begin)==s.charAt(len-begin-1)) return testHuiwenHelper(s, begin+1, len); else if(begin==len>>1) return true; else return false; } //6. 翻转整数 如:1024=>4201 public static int reverseInt(int i){ return reverseIntHelper(i, 0); } private static int reverseIntHelper(int i, int init){ if(i==0) return init; return reverseIntHelper(i/10, init*10+i%10); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值