【Java学习】递归,斐波那契数案例

用递归求第n个斐波那契数

斐波那契数是形如:1,1,2,3,5,8,13,21,34,55,89,144,........

第一第二项是1,第三项是前两项的和1+1=2,第四项是第二第三项的和1+2=3,所以第n项是第n-1项与n-2项的和。

首先要明确,递归是一种算法,它可以是方法自己调用自己,也可以是方法调用其他方法,其他方法又回调方法自己同时一定要控制好终止,否则会出现递归死循环,导致栈内存溢出错误。

回到案例中:

1、首先设计的递归方法中的计算要满足斐波那契数的数学计算规则,即第n项是第n-1项与n-2项的和,和第一项和第二项是1。

那么也就有了最基本的思路,首先方法中要想办法给第一项和第二项设置为固定值1,同时满足要求得的第n个数等于(n - 1) + ( n - 2),那么不妨设定为将方法接收的参数为int类型的n,n让用户来输入,返回值设置为int,直接返回计算得到的值。

 2、如何调用递归?

前面提到了斐波那契数中第一个和第二个数固定为1,而后面的数列中的数又都是该数的前两个数相加得到的,那么不妨就将第一个和第二个数作为递归开始返回的地方。

举例子:

求第5个斐波那契数

递归思路:第5个数需要第4个和第3个数相加,而第4个数又需要第3个数和第2个数相加,第三个数又又需要第2个数和第1个数相加...以此类推,第2个数和第1个数固定为1,那么最下层的递归就可以根据第1个和第2个数层层向上计算,所以这两个数就可以作为递归返回的位置。

如图:

3、代码实现

 

import java.util.Scanner;

public class Test2_1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请选择要求第几个斐波那契数:");
        int choose = sc.nextInt();

        System.out.println(getNumber(choose));
    }

    public static int getNumber(int n) {
        //判断本次递归传入的n是否是第1个或第2个
        if (n == 1 || n == 2) {
            return 1;
        }
        return getNumber(n - 1) + getNumber(n - 2);
    }
}

递归方法getNumber中的  if (n == 1 || n == 2)

用来判断本次递归传入的n是否是第1个或第2个,如果是,那么直接返回1。

在未递归到第1、第2个数时,方法会直接执行

return getNumber(n - 1) + getNumber(n - 2);

以此来调用方法自己。

在一层层递归形成之后,一旦递归到最后的第1、第2个数时,便不会再执行调用方法自己的语句,直接返回数值,此时一层层的递归便开始一边根据下面返回的数值计算,一边将计算得到的数值返回上一层,最终返回要求得的数。

注:此案例主要意在理解递归的思路和过程,实际的斐波那契数计算要是用本案例展示的代码计算的话,很容易超过int的长度而变成负数,且时间冗长(doge

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值