青蛙上台阶,可以一下跳1步,也可以一下跳2步,n层台阶所有跳法?

本文详细解析了经典的青蛙跳台阶问题,通过递归算法找出所有可能的跳跃方式,并使用栈来记录每一种跳跃路径。此外,还介绍了如何利用斐波那契数列快速求解跳跃方案的数量。

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

青蛙上台阶,可以一下跳1步,也可以一下跳2步,n层台阶所有跳法?


问题分析:

1. 该问题为斐波那契数列问题,问题的求解方法是对子问题的递归求解。

f(n)=f(n-1)+f(n-2)n>2,

f(1)=1,

f(2)=2.

2. 求解出所有解法,则需要用栈记录递归中的解法。


Java代码:

public class JavaTest {

    int[] stack=new int[50];

    int top;

    int count;

    boolean flag;

    public void compute(int n){

        if(n>0){

            top=0;

            count=0;

            f(n);

        }

        int cc=0;

        if(n==1)

            cc=1;

        else if(n==2)

            cc=2;

        else{

            int a=1,b=2;

            for(int i=3;i<=n;i++){

                b=a+b;

                a=b-a;

            }

            cc=b;

        }

        if(n>0){

            if(flag||cc!=count)

                System.out.println("count:\t"+count+"\tcc:\t"+cc+"\t"+(cc==count));

        }

    }

    public void f(int n){

        if(n<=0)

            return;

        else if(n==1){

//            n=1时,只有一种走法,一下走一步

            stack[top++]=1;

            print();

            top--;

        }else if(n==2){

//            n=2时,有两种走法,一下走两步,或者在走一步的基础上再走一步

            stack[top++]=2;

            print();

            top--;


            stack[top++]=1;

            f(n-1);

            top--;

        }else{

//            n-2的基础上走两步

            stack[top++]=2;

            f(n-2);

            top--;

 

//            n-1的基础上走一步

            stack[top++]=1;

            f(n-1);

            top--;

        }

    }

    public void print(){

        count++;

        if(flag){

            System.out.println(count);

            for(int i=top-1;i>=0;i--){

                System.out.print(stack[i]+" ");

            }

            System.out.println();

        }

    }

    public JavaTest(boolean flag){

        this.flag=flag;

    }

 

    public static void main(String[] args) {

        JavaTest jt=new JavaTest(true);

        Print("Start...");

        for(int i=0;i<10;i++)

            jt.compute(i);

        Print("End");

    }

 

    public static void Print(Object obj) {

        System.out.println(String.valueOf(obj));

    }

}


问题扩展:

兔子繁殖问题


下载地址:

http://download.youkuaiyun.com/download/ssuchange/6706099


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值