递归相关问题

棋盘m×n的走法:

        给定一个M×N的格子或棋盘,从左下角走到右上角的走法总数(每次只能向右或向上移动一个方格边长的距离
        f(m,n)=f(m-1,n)+f(m,n-1).
        于是状态f(i,j)的状态转移方程为:
        f(i,j)=f(i-1,j)+f(i,j-1)   if i,j>0
        f(i,j)=f(i,j-1)            if i=0
        f(i,j)=f(i-1,j)            if j=0
        f(0,0)=0, f(0,1)=1, f(1,0)=1
    递归方式:
        public static int process(int m,int n){ if(m==0&&n==0){ return 0; }
            if(m==1||n==1){ return 1; }
            return process(m,n-1)+process(m-1,n);
        }

爬楼梯:

public class Test3 {
    public static void main(String[] args) {
        int ladder = 4;
        int maxJump = 2;
        int i = cal(ladder, maxJump);
        System.out.println(i);

        System.out.println(count(4));
    }
    /* 设4个台阶,可走1、2,分析如下: 开始 / \ 1 2 / \ /\ 1 2 2 1 / \ \ \ 1 2 1 1 / 1 */
    //递归
    public static int cal(int ladder,int maxJump){
        int  jump=0;
        if(ladder==0){
            return 1;
        }
        if(ladder>=maxJump){
            // 剩下的楼梯大于最大可跳跃数
            for(int i=1;i<=maxJump;i++){
                jump+=cal(ladder-i, maxJump);
            }   
        }else{
            // 剩下的楼梯不足最大可跳跃数
            jump=cal(ladder,ladder);
        }
        return jump;
    }
    //斐波那契数列
    //自己计算当楼梯数为1、2、3、4、5时,对应的爬法有:1、2、3、5、8、13、21种。 
    //可以发现,随着楼梯数n的增加,爬法总数呈现斐波那契数列规律增加,即f(n) = f(n-1) + f(n-2) 
    /* f(5) / \ f(4) f(3) / \ f(3) f(2) / \ f(2) f(1) */
    public static int count(int ladder){
        if(ladder==1||ladder==2){
            return ladder;
        }
        int n1=1;
        int n2=2;
        int all=0;
        for(int i=3;i<=ladder;i++){
            all=n2+n1;
            n1=n2;
            n2=all;
        }
        return all;
    }   }
    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/linkingfei/article/details/82314811
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞