一个有N个格子组成的直线道路,每次可以前进1格或者2格,一种有多少种方式可以走到终点?

这篇博客探讨了一个有N个格子的直线道路问题,每步可前进1格或2格。通过递归或递推公式解决到达终点的不同路径数。博主指出,当n=1时有1种方式,n=2时有2种方式,递推公式为f(n)=f(n-1)+f(n-2),并强调了递归计算中重复计算的问题,建议使用状态保存以提高效率。对于较大的n值,如n=40,不保存状态的执行次数远高于保存状态的情况,强调了优化递归的重要性。

用递归或者递推
f(n)=f(n-1) +f(n-2) n>=2

当只有1个格子的时候 只有1种方式 f(1)=1
当有2个格子的时候 有2种方式 f(2)=2
递归条件结束就是 0<=n<=2时候 f(n)=n

public int f(int n){
if(n<=2){
return n;
}else{
return f(n-1)+f(n-2);
}
}

这个递归里面有很多重复的计算,比如说f(6)=f(5)+f(4) f(7)=f(6)+f(5)
这样f(5) 就重复计算了。

使用状态保存存起来。

 public static void main(String[] args) {
	    int a=f(10);
        System.out.println(a);
        System.out.println("执行次数:"+count);


    }

     static int  count=0;
   static int arr[]=new int[100];

    public static int f(int n){
        count++;

        if(n<=2){
            return n;
        }else{

            int f1=0;
            int f2=0;

            if (arr[n-1]!=0){
                f1=arr[n-1];
            }else {
                f1=f(n-1);
                arr[n-1]=f1;
            }

            if (arr[n-2]!=0){
                f2=arr[n-2];
            }else {
                f2=f(n-2);
                arr[n-2]=f2;
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值