一,青蛙跳台阶问题
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;
}