题目:
题1:现在要求输入一个整数n,请你输出斐波那契数列的第n项。
题2:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题3:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
题4:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路解析:
- 题1:从下往上计算,保存中间计算过程的结果,循环
- 题2:跳上第n阶台阶时可以分成两种情况,(1)最后一步跳1阶,则f(n) = f(n-1); (2)最后一次跳2阶,则f(n) = f(n-2); 即f(n) = f(n-1) +f(n-2)
- 题3:和2的思路一致,f(n) = f(n-1) +f(n-2) +f(n-3)+......+f(1)+1,解得f(n) =
- 题4:盖满大矩阵的最后一步也可以分两种情况,(1)竖着盖,则f(n) = f(n-1); (2)横着盖,其对应的下面或上面也得横着盖,则f(n) = f(n-2);即f(n) = f(n-1) + f(n-2)
代码实现:
package jzoffer;
import com.sun.corba.se.spi.orbutil.fsm.Guard.Result;
import com.sun.xml.internal.ws.api.pipe.Fiber;
public class Num10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 8;
Integer result= Fib(6);
Integer result2= comNum(3);
System.out.println(result2);
}
//题1计算斐波那契数列
private static Integer Fib(int n) {
int[] result = {0, 1};
if(n<2) {
return result[n];
}
//定义num1、num2、sum
int fibNum1= 0;
int fibNum2= 1;
int sum= 0;
for(int i=2; i<n; i++) {
sum = fibNum1 + fibNum2;
fibNum1 = fibNum2;
fibNum2 = sum;
}
return fibNum2;
}
//题2青蛙跳
private static Integer comNum(int n) {
int[] result = {1, 2};
if(n<=0) {
return null;
}
if(n<3) {
return result[n];
}
//定义num1、num2、sum
int fibNum1= 1;
int fibNum2= 2;
int sum= 0;
for(int i=2; i<n; i++) {
sum = fibNum1 + fibNum2;
fibNum1 = fibNum2;
fibNum2 = sum;
}
return fibNum2;
}
}
来源:CSDN
作者:一只帅气的小菜鸡
链接:https://blog.csdn.net/weixin_42028608/article/details/103284501