青蛙跳台阶问题与汉诺塔问题

一,青蛙跳台阶问题

1.分析

这是我们画的台阶:

青蛙每次只能往上跳一阶或者二阶

由此我们能简单得到青蛙跳一阶有一种跳法。

青蛙跳两阶有两种跳法。

如果第一次跳一阶,那么还剩(n-1)阶:

如果第一次跳两阶,那么还剩(n-2)阶:

我们定义一个jump函数来表示青蛙跳n个台阶一共有多少种跳法;

那么它跳n阶就有jump(n)种跳法

假设第一次跳一阶,那么跳完后从第二层台阶往上跳就有jump(n-1)种跳法

假设第一次跳两阶,那么跳完后从第三层台阶往上跳就有jump(n-2)种跳法

那么它那么它跳n阶就有jump(n-1) + jump(n-2)种跳法

分析到这里我们便大概能够写出代码了

2.代码实现

Java:

import java.util.Scanner;

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

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        int ret = jump(n);
        System.out.println("青蛙跳上" + n + "个台阶有" + ret + "种跳法");
    }
}

C:

#include<stdio.h>
int jump(int x)
{
	if (x == 1) {
		return 1;
	}
	if (x == 2) {
		return 2;
	}
	return jump(x - 1) + jump(x - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = jump(n);
	printf("青蛙跳%d层台阶有%d种跳法\n", n, ret);
	return 0;
}

以上都是根据思路使用递归解决的问题,我们也可以尝试使用迭代来解决

import java.util.Scanner;

public class Main {
    public static int jump(int n) {
        int a = 1;
        int b = 2;
        int c = 0;
        if (n <= 2) {
            return n;
        }
        while (n > 2) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        int ret = jump(n);
        System.out.println("青蛙跳上" + n + "个台阶有" + ret + "种跳法");
    }
}

二,汉诺塔问题

现有A,B,C三个位置,小和尚要把n个盘子从A移动到C处,要求每次移动必须保证小盘子在上,大盘子在下,且每次只能移动一次盘子。

1.分析

A,B,C三处位置

假设A上有一个盘子

这时候要移动盘子很简单,只需要将A直接移动到C上就可以了

当A上有两个盘子时

我们便需要将小盘子先移动到B,再将大盘子移动到C,最后将小盘子移动到C才可以

当盘子达到三个时

我们假设上方两个盘子是2一个盘子,那么我们就首先得移动上方盘子到B

当有n个盘子时我们便可以把他分解成多个模块

我们很容易又想到了递归的方式

2.代码实现

Java:

import java.util.Scanner;
public class Main {
    public static void Hanoi(int n,char pos1,char pos2,char pos3) {
        if (n == 1) {
            move(pos1,pos3);
            return;
        }
        Hanoi(n - 1,pos1,pos3,pos2);
        move(pos1,pos3);
        Hanoi(n - 1,pos2,pos1,pos3);
    }
    public static void move(char pos1,char pos2) {
        System.out.println(pos1 + "——>" + pos2 + " ");
        System.out.println(" ");
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        Hanoi(n,'A','B','C');
    }

C:

#include<stdio.h>
void move(char pos1, char pos2)
{
    printf("%c——>%c\n", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2, char pos3)
{
    if (n == 1) 
    {
        move(pos1, pos3);
        return;
    }
    Hanoi(n - 1, pos1, pos3, pos2);
    move(pos1, pos3);
    Hanoi(n - 1, pos2, pos1, pos3);
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    Hanoi(n, 'A', 'B', 'C');
	return 0;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小六学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值