java中关于爬楼梯算法的研究

本文探讨了一种特殊的爬楼梯问题,即避开特定阶数M的情况下,计算从起点到达终点的不同路径数量。采用递归方法结合斐波那契数列进行求解,并提供Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先题目是这样的:学校里有一个很长很长的楼梯,大家都称其为百步梯,但是具体层数大家都不清楚(台阶数N<=1000000)。Robin每天去上课都要经过这个楼梯,但是由于Robin很不喜欢数字M,所以每次经过都会刻意避开第M级台阶。(奇怪的Robin)Robin每次可以跨一级或两级台阶,试求Robin走楼梯的路径总数(注意Robin是无论如何都不会踏上第M级台阶的)。

爬楼梯可以用到斐波那契数列F(0) = 0,F(1)=F(2)=1,F(n)=F(n-1)+F(n-2) (n≥3)所以我们程序中需要用到递归函数。记住如果楼梯的阶数是N,这上楼梯的方法总数为f(N+1)。而这题中因为存在一阶我们不能登,所以可以将问题划分为两个子问题,第一个是从0阶到M-1阶,第二个是从M阶到N阶,然后二者相乘就可以了。 

代码如下:

import java.util.Scanner;

/**
 * Created by Administrator on 2016/4/19.
 */
public class Recursive {
    public static int fn(int n) {
        if (n == 0) {
            return 0;
        } else if (n == 1 | n == 2) {
            return 1;
        } else return fn(n - 1) + fn(n - 2);
    }

    public static void main(String[] args) {
        int N, M, sum;
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            N = Integer.parseInt(sc.next());
            M = Integer.parseInt(sc.next());
            sum = fn(N - M) * fn(M);
            System.out.println(sum);
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值