关于递归的问题

关于递归的问题

Fibonacci递归问题

代码如下

public static void main(String[] args){
    System.out.prinrtln(fibonacci(10));
}
public static int fibonacci(int n){
    if(n==1 || n==2){
        return n;
    }
    return fibonacci(n-2)+fibonacci(n-1);
}

这个程序很容易理解,返回的值就是对每一项求和最后的值。但是却没注意递归边界(什么时候return),每一次return后返回程序代码的那些地方,并继续执行下去;

今天在做一个关于质因数分解的题目的时候,注意到了这个问题,代码如下:

public static void main(String[] args){
    System.out.println(number+"分解为:"+i);
    factors(12);
}
public static void factors(int number){
    if(number==0 || number==1){
           return;
       }
    int max = number;
    for(int i=2;i<=max;i++){
        if(number%i==0){
            System.out.print("\t"+i);
            number = number/i;
            factors(number);
         }
    }
    return;
}

执行结果:
这里写图片描述

与预期不相符,原因出在什么问题呢?????

经过在代码中输出语句发现,当最终执行完递归的子函数,number=1,返回时,是回到了循环for()语句中,由于子函数返回后,中断完成,恢复现场number又变回了上一级为分解的那个值,继续在for()循环执行,从而最终导致了错误的返回结果。

正确的return位置应为for()循环if()语句的fibonacci()函数后:
此时子函数处理完后,直接返回,不在进行for()过程

public static void factors(int number){
    if(number==0 || number==1){
           return;
       }
    int max = number;
    for(int i=2;i<=max;i++){
        if(number%i==0){
            System.out.print("\t"+i);
            number = number/i;
            factors(number);
            return;
         }
    }
}

这里写图片描述

当然这是最简单的算法,如果遇到一些很大的素数,效率就可不是那么高了,我们可以使用建立素数表,或者其他判断素数的方法的方法对算法进行改进:

static unsigned aPrimeList[] = { // 素数表  
        1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,  
        43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 113,   
        193, 241, 257, 337, 353, 401, 433, 449, 577, 593, 641,   
        673, 769, 881, 929, 977, 1009, 1153, 1201, 1217, 1249,   
        1297,1361, 1409, 1489, 1553, 1601, 1697, 1777, 1873,   
        1889, 2017, 2081, 2113, 2129, 2161, 2273, 2417, 2593,   
        2609, 2657, 2689, 2753, 2801, 2833, 2897, 3041, 3089,   
        3121, 3137, 3169, 3217, 3313, 3329, 3361, 3457, 3617,   
        3697, 3761, 3793, 3889, 4001, 4049, 4129, 4177, 4241,   
        4273, 4289, 4337, 4481, 4513, 4561, 4657, 4673, 4721,   
        4801, 4817, 4993, 5009, 5153, 5233, 5281, 5297, 5393,   
        5441, 5521, 5569, 5857, 5953, 6113, 6257, 6337, 6353,   
        6449, 6481, 6529, 6577, 6673, 6689, 6737, 6833, 6961,   
        6977, 7057, 7121, 7297, 7393, 7457, 7489, 7537, 7649,   
        7681, 7793, 7841, 7873, 7937, 8017, 8081, 8161, 8209,   
        8273, 8353, 8369, 8513, 8609, 8641, 8689, 8737, 8753,   
        8849, 8929, 9041, 9137, 9281, 9377, 9473, 9521, 9601,   
        9649, 9697, 9857   
    };  

待续>>>>>>>>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值