解题思路:方法一:递归思路; 因为从m往下走的时候只有两种选择,要么下一要么下二,可以理解为f(m) = f(m-1) +f(m-2),
所以要求f(m)只需求出 f(m-1) 和f(m-2),然后依次往下递归,直到m<=2的时候就意味着只有一种方法也就是只能下一格楼梯,因为如果m>2的时候还可以选择是下一还是下二。但是如果m大一点的话f(m) 往下分的f(m-1) +f(m-2)会越来越多,因此可能会超时的捏(个人觉得而已)。****(如果不是张叔叔强制要求要用递归加函数来解题目的话)****
方法二三:如下代码
2)注意事项:
参考代码:
package dotcppTest1;
import java.util.Scanner;
/** 方法一:递归
* @author 迷路的年轻人
* @create 2021-11-10 23:02
*/
public class Main {
private static int getMethod(int m){
return m <= 2 ? 1: getMethod(m - 1) + getMethod(m - 2);
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
while(n-->0){
int m = scan.nextInt();
System.out.println(Main.getMethod(m));
}
}
}
package dotcppTest1;
import java.util.Scanner;
/**方法二:动态转化
其实仔细观察一下也还是可以看出来,这玩意的规律也就和那个斐波那契数列的规律一毛一样,大概如下:
楼梯数:1 2 3 4 5 6 7
方法数:1 1 2 3 5 8 13
由上规律就可以用动态转化来解决捏
只需要用3个整型变量记录位置就行
假设要求楼梯为6的方法数,a,b,c,的位置如下
未转化前
楼梯数:1 2 3 4 5 6 7
方法数:1 1 2 3 5 8 13
a b c
转化后
楼梯数:1 2 3 4 5 6 7
方法数:1 1 2 3 5 8 13
a b c
也就是说在c = 6的时候只需要把前面两个 a 和 b指向的方法数加起来就行,就是c每次向右转移的时候ab跟着一起走
* @author 迷路的年轻人
* @create 2021-11-10 23:11
*/
public class Main1 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
while(n-->0){
int m = scan.nextInt();// a b c
int a=0,b=0,c=1;// 1 2 3
for(int i=1;i<m;i++){//0 0 1 1 2 3 5 8 13
a=b;
b=c;
c=a+b;
}
System.out.println(c);
}
}
}
方法三:斐波那契数列的通项公式
由上规律可以知道,其实直接用斐波那契数列的通项公式就可以直接求出来,什么都不用思考,套就完事了
package dotcppTest1;
import java.util.Scanner;
public class Main2 {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
while(n-->0){
double m = scan.nextDouble();
double sqrt_f = Math.sqrt(5);
double ans = Math.pow((1+sqrt_f)/2,m)-Math.pow((1-sqrt_f)/2,m);
int ending =(int)(ans/sqrt_f);
System.out.println(ending);
}
}
}
0.0分
2 人评分
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:400 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)from DQM浏览:773 |
字符逆序 (C语言代码)浏览:645 |
Cylinder (C语言描述+详细分析)浏览:3375 |
简单的a+b (C语言代码)浏览:457 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:755 |
Pascal三角 (C语言代码)浏览:707 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:569 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:587 |
老王赛马 (C语言代码)浏览:1733 |