几种方法的尾递归实现
http://freejvm.iteye.com/blog/976878
需要找时间验证一下,另外还需要学习多个参数的尾递归如何来实现的技巧
斐波那契数列第n个数的求值,
public static long fibo4(int n) { if (n < 2) { return n - 1; } else { return fibo4Helper(n, 0, 1, 3); //保持与非尾递归接口不变,是借助帮助方法实现尾递归的 } } private static long fibo4Helper(int n, long prepre, long pre, int begin) { if (n == begin) { return pre + prepre; } else { return fibo4Helper(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); } }
作者:Chuck Lu GitHub |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2014-07-10 Win7系统中如何查看当前文件被哪一个程序占用了