ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

图解青蛙跳台阶和汉诺塔问题(C语言+Java语言实现)

2021-10-30 19:32:28  阅读:199  来源: 互联网

标签:柱子 Java int 台阶 跳法 C语言 汉诺塔 Fibonacci return


目录

一,写在前面

二,求解青蛙跳台阶

1,题目

2,图解

3,斐波那契数列回顾

 4,C语言实现

5,Java实现

三,汉诺塔问题

1,题目

2,图解

3,C语言实现

 4,Java实现


一,写在前面

青蛙跳台阶和汉诺塔都是比较经典的题目,我觉得作为一个合格的程序员,应该要很好的掌握它,

如何你觉的本章博客写的不错的话,求收藏,求点赞,求评论,您的三连是我进步最大的动力,废话不多说,让我们学起来吧!!!

二,求解青蛙跳台阶

1,题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

2,图解

 

 

 

 

  1. 如果n=1,只有一种跳法,那就是1

  2. 如果n=2,那么有两种跳法,2,[1,1]

  3. 如果n=3,那么有三种跳法,[1,1,1],,[1,2],[2,1]

  4. 如果n=4,那么有五种跳法,[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]

 看到这里我们可能想到的斐波那契数列,先来回顾一下斐波那契数列。

3,斐波那契数列回顾

斐波那契数列含义(百度百科):指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

递归方式:

 public static int fibnacci(int n){
        if (n==0){
            return 0;
        }
        if (n==1){
            return 1;
        }
        return fibnacci(n-1)+fibnacci(n-2);
    }

非递归方式:

我们计算n为4的情况:那么我们需要做如下的计算:
    Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
    = Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
    = Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
 看看,多做了多少计算。2 计算了 2次,1 计算了5次,0计算了3次。正常来说我们计算4次就可以了吧。这样相当于多做了4次。

public static int fibnacci2(int n){
        if (n==0){
            return 0;
        }
        if (n==1 || n==2){
            return  1;
        }
        int f1=1;
        int f2=1;
        int count=3;
        while (count++<=n){
            int temp=f1;
            f1=f2;
            f2=temp+f2;
        }
        return f2;
    }

 4,C语言实现

我们设台阶数位N;
当N=1时,当然只有1种跳法;
当N=2时,青蛙可以跳2次1层和跳1次2层;
当N=3时,当有3层台阶时,青蛙可以选择先跳1层,剩下2层台阶,所以此时就是有2层台阶时的跳法,有2种;当青蛙选择第一次跳2层台阶时,剩下1层台阶,此时有1层台阶时的跳法,所以3层台阶时的方法是:2层台阶的方法 + 1层台阶的方法。
当N=4时,具体跳法为: 1、先跳1层 若先跳1层,则剩下3层,接下来就是3层台阶的跳法。 2、先跳2层 若先跳2层,则剩下2层,接下俩就是2层台阶的跳法,所以4层台阶的方法为:3层台阶的方法+2层台阶的方法。
以此类推,当N=n时,n层台阶的方法为: n-1层台阶的方法+ n-2 层台阶的方法

#include<stdio.h>
int frog(int n)
{
   if(n == 1)
   {
      return 1;
   }
   if(n == 2)
   {
      return 2;
   }
   return frog(n-1) + frog(n-2);
}
int main()
{
   int n;
   scanf("%d",&n);
   int ways = frog(n);
   printf("%d\n",ways);
   return 0;
}

5,Java实现

递归方式:

public static int jump(int n){
        if (n==0)
            return 0;
        if (n==1)
            return 1;
        if (n==2)
            return 2;
        return jump(n-1)+jump(n-2);
    }

 非递归方式:

 public static int jump2(int n){
        if (n==0)
            return 0;
        if (n==1)
            return 1;
        if (n==2)
            return 2;
        int n1=1;
        int n2=2;
        int count=2;
        while (count++<=n){
            int tmp=n1;
            n1=n2;
            n2=tmp+n2;
        }
        return n2;
    }

三,汉诺塔问题

1,题目

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说益智游戏。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

2,图解

 

3,C语言实现

#include <stdio.h>
void hanoi(int n, char A, char B, char C)//n个圈圈在柱子A上,借助柱子B,移动到柱子C上
{
    if (n == 1)//如果A柱子上只有一个圈圈,直接移动到C上
        printf("%c --> %c\n", A, C);
    else
    {
        hanoi(n - 1, A, C, B);//将A柱子上的n-1个圈圈,借助柱子C,移动到柱子B上
        printf("%c --> %c\n", A, C);//将A柱子上的最后一个圈圈移动到柱子C上
        hanoi(n - 1, B, A, C);//将B柱子上的n-1个圈圈,借助柱子A,移动到柱子C上
    }
}

int main()
{
    hanoi(3, 'A', 'B', 'C');
    return 0;
}

 4,Java实现

class Text{
    public static void move(char pos1,char pos2) {
        System.out.print(pos1+" -> "+pos2+" ");
    }

    public static void hanio(int n,char pos1,char pos2,char pos3) {
        if(n == 1) {
            move(pos1,pos3);
        }else {
            hanio(n-1,pos1,pos3,pos2);
            move(pos1,pos3);
            hanio(n-1,pos2,pos1,pos3);
        }
    }

    public static void main(String[] args) {
        hanio(1,'A','B','C');
        System.out.println();
        hanio(2,'A','B','C');
        System.out.println();
        hanio(3,'A','B','C');
        System.out.println();
    }
}

 

 

 

 

标签:柱子,Java,int,台阶,跳法,C语言,汉诺塔,Fibonacci,return
来源: https://blog.csdn.net/qq_50156012/article/details/121053671

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有