斐波那契数列应用

本文探讨了斐波那契数列在多种情境下的应用,包括计算阶跃的不同跳法、覆盖矩形的方法数量、兔子繁殖的数量增长等问题,并提供了相应的Java代码实现。

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

  • 题目描述:

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

分析:根据斐波那契数列定义可以使用递归  Fibonacci(int n)=Fibonacci(int n-1)+Fibonacci(int n-2)

Fibonacci(0)==0

Fibonacci(1)==1

  • n<=39

  • 题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

分析:斐波那契数列的应用,只能从n-1个台阶或者n-2个台阶调到第n个台阶,且剩下一种跳法,从n-2个台阶开始跳,只能挑两步,跳一步包含在从n-1的台阶跳的情况里

public int JumpFloor(int target) {
		 	if(target==1){
		 		return 1;
		 	}
		 	if(target==2){
		 		return 2;
		 	}
		 	return (JumpFloor(target-1)+JumpFloor(target-2));
	    }

 

 public int JumpFloorII(int target) {
	        return (int)Math.pow(2,target-1);
	    }
  • 题目描述 

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

f(n)=f(n-1)+f(n-2)+f(n-3)+.....+f(1)         1式

f(n-1)=f(n-2)+f(n-3)+f(n-4)+.....+f(1)      2式

1式-2式可得  f(n)=2*f(n-1)

f(1)=1

是一个2为公比的等比数列an=a1*q^(n-1)

  • 题目描述

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

public class Solution {
    public int RectCover(int target) {
         if(target<=0)
        {
            return 0;
        }
        if(target==1)
        {
            return 1;
        }
        if(target==2)
        {
            return 2;
        }
        return (RectCover(target-1)+ RectCover(target-2));
    }
}
  • 题目描述

题目描述

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

(1)斐波那契数列,比如第三个月的兔子数等于第二个月的兔子数加第一个月的兔子数(第一个月的兔子到第三个月,每只兔子都会生一只兔子)

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int N = scanner.nextInt();
			System.out.println(getRabbit(N));

		}
	}
	private static int getRabbit(int n) {
		if(n==1 || n==2){
			return 1;
		}
		return getRabbit(n-1)+getRabbit(n-2);
	}

}

 (2)递归求解,空间复杂度高

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int N = scanner.nextInt();
			ArrayList<Integer> list = new ArrayList<>();
			int first = 1;
			list.add(first);
			System.out.println(getRabbit(first, N, list));

		}
	}
	private static int getRabbit(int first, int n, ArrayList<Integer> list) {
		if (first < n - 1) {
			int count = 0;
			for (int i = first + 2; i <= n; i++) {
				list.add(i);
				count++;
			}
			int sum = list.size();
			for (int j = sum - count; j < sum; j++) {
				getRabbit(list.get(j), n, list);

			}
		}
		return list.size();
	}

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值