解题思路:方法一:递归思路; 因为从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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复