解题思路:方法一:递归思路; 因为从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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论