题10:斐波那契数列

该博客介绍了如何计算斐波那契数列的第n项,分别通过递归和循环两种方法实现。递归方法直接根据斐波那契数列的定义进行计算,循环方法避免了重复计算,提高了效率。同时,博主通过2 * 1小矩形覆盖2 * n大矩形的问题,直观解释了斐波那契数列的性质。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

在这里插入图片描述

首先用简单的递归实现:

public class Fibonacci{
	
	public int fibRecusion(int n){
		if(n < 0){
			return 0;
		}
		if(n == 1){
			return 1;
		}
		return fibRecusion(n - 1) + f(n - 2);
	}

}

再用循环实现:

public class Fibonacci{

	public int fibCircle(int n){
		
		int one = 0;
		int two = 1;
		
		if(n <= 0){
			return one;
		}
		if(n == 1){
			return two;
		}
		
		int res = 0;
		for(int i = 2;i <= n;i++){
			res = one + two;
			one = two;
			two = res;
		}
	
		return res;
	}


}

我们可以用2 * 1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2 * 1的小矩形无重叠地覆盖一个2 * n的大矩形,总共有多少种方法?

在这里插入图片描述

  1. 当我们把2 * 1 的格子竖着放在第一列的时候,剩余7列我们有f(7)种方法
  2. 当我们把2 * 1 的格子横着放在第一列的时候,剩余6列我们有f(6)种方法
  3. 综上所述,8列的格子所有方法之和为f(8) = f(7) + f(6)
  4. 所以,这依然是一个斐波那契数列

方式一:利用递归

public class RectCover {

    //递归 : num=1,result=1;num=2,result=2;num>2;result=前面两个数之和
    public int cover(int num){

        int[] result = {1,2};

        if(num <= 0){
            return 0;
        }
        if(num > 0 && num < 3){
            return result[num - 1];
        }
        return cover(num - 1) + cover(num - 2);
    }
    
}

方式二:利用循环

public class RectCover {
   
    public static int cover(int num){

        int[] result = {1,2};

        if(num <= 0){
            return 0;
        }

        if(num > 0 && num < 3){
            return result[num - 1];
        }

        int minusOne = 2;
        int minusTwo = 1;
        int res = 0;
        
        for(int i = 3;i <= num;i++){
            res = minusOne + minusTwo;
            minusTwo = minusOne;
            minusOne = res;
        }

        return res;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值