【华为机试】猴子爬山问题
题目描述:
一天一只顽猴想要从山脚爬到山顶 途中经过一个有n个台阶的阶梯,但是这个猴子有个习惯,每一次只跳1步或3步 试问?猴子通过这个阶梯有多少种不同的跳跃方式
输入描述
输入只有一个这个数n 0 < n < 50 此阶梯有多个台阶
输出描述
有多少种跳跃方式
示例1
输入 50 输出 122106097
示例2
输入 3 输出 2
代码
import java.util.Scanner; public class OneStar_04 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入阶梯的台阶数:"); int n = scanner.nextInt(); solution(n); // System.out.println(fun(n)); } //使用循环实现,共执行n-2次循环 private static void solution(int n) { int step1 = 1 , step2 = 1 , step3=2; //step4 用来存储最后的跳跃方式数量。 //由于当n为1或2时只有一种跳跃方式,n大于1或2时有2种及以上的跳跃方式 int step4 = n == 1 || n == 2 ? 1 : 2; //当n=3时,必定有2种跳跃方式 //当n>3时,有大于2种跳跃方式 /** * n = 1 s1 = 1 * n = 2 s2 = 1 * n = 3 s3 = 2 * n = 4 s4 = 1 + 2 * n = 5 s4 = 1 + 3 * n = 6 s4 = 2 + 4 * n = 7 s4 = 3 + 6 * */ for(int i = 4 ; i <= n ; i++){ step4 = step1 + step3; //观察每一种台阶数下的跳跃方式总数 //System.out.println(step4); step1 = step2; step2 = step3; step3 = step4; } System.out.println(step4); } //使用递归实现,同理斐波那契数列(112358...) private static int fun(int n) { if (n == 1 || n == 2) { return 1; } if (n == 3) { return 2; } int sum = 0; if (n > 3) { sum = fun(n - 1) + fun(n - 3); } return sum; } }