几种方法的尾递归实现

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);
     }
}  
时间: 2024-12-05 09:30:48

几种方法的尾递归实现的相关文章

[Java]函数求阶乘n!(factorial)(四种方法)

1. 引言 实现阶乘的方法很多,这边介绍三种方法,分别是递归,尾递归,循环和BigDecimal. 2. 代码 public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Alogrithm a = new Alogrithm1(); a.fact(5); a.print(a.factN(6)); a.print(a.factFor(7)); } } class A

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

利用颜色和形态学两种方法进行车牌区域提取的OpenCV代码

要想提取车牌号,首先你要定位车牌区域嘛,本文分别两种方法用,即颜色和形态学的方法,对车牌区域进行判定.说得是两种方法,其实两种方法并无多大的区别,只是有一步的判断标准不一样而已,你看了下面整理出的的思路就知道两者的区别真的很小了. 方法一:利用颜色提取车牌区域的思路: ①求得原图像的sobel边缘sobelMat ②在HSV空间内利用车牌颜色阈值对图像进行二值化处理,得到图像bw_blue→ ③由下面的判别标准得到图像bw_blue_edge for (int k = 1; k != heigh

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

XML解析的几种方法

第一种方法系统自带的解析方法(NSXMLParser) //1.指定XML文件 NSString *path=[[NSBundle mainBundle] pathForResource:@"person" ofType:@"xml"]; //转换成data类型对象 NSData *data=[NSData dataWithContentsOfFile:path]; //2.为parser指定初始值 NSXMLParser *parser=[[NSXMLParser

Spring官网下载dist.zip的几种方法

Spring官网下载dist.zip的几种方法 Spring官网改版后,很多项目的完整zip包下载链接已经隐掉了,虽然Spring旨在引导大家用更“高大上”的maven方式来管理所依赖的jar包,但是完全没想到中国的国情,在伟大的墙内,直接通过maven下载墙外的东西,要么龟速,要么直接被和谐. 下面是从网上搜集的一些方法,可用于一次性下载Spring各项目的完整dist.zip 第一种 直接 http://repo.springsource.org/libs-release-local/org

SSH 框架打开项目自动执行action的第二种方法

web.xml还是什么不配置 <welcome-file-list> <welcome-file></welcome-file> </welcome-file-list> struts.xml加上这个 <default-action-ref name="index" /> 同时原来的修改为这样 <action name="index" class="index"> <r

Java 计算中英文长度的若干种方法

在项目开发中经常碰到到输入字符的校验,特别是中英文混合在一起的校验.而为了满足校验的需求,有时需要计算出中英文的长度. 本文将通过几种常用的方法实现长度的计算: <span style="font-size:18px;">import java.io.UnsupportedEncodingException; /** * 中英文校验的处理 * @author a123demi * */ public class EnChValidate { public static vo

分区自动挂载的三种方法

一.修改/etc/rc.local配置文件追加类似命令:mount /dev/sda1  /sda1 到配置文件最后一行 二,修改/etc/fstab配置文件追加类似命令:/dev/sda1   /sda1  ext4   defaults   0  0 到配置文件中 三,安装autofs服务yum install autofs 追加类似命令:sda1   -fstype=ext4  :/dev/sda1 到配置/etc/autofs.misc文件中重启服务: service autofs re