-
题目描述:
大家都知道斐波那契数列,现在要求输入一个整数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();
}
}