• ⻘蛙跳台阶问题
⻘蛙跳台阶问题是一个经典的数学问题,常用于介绍递归和动态规划算法。问题描述如下:假设有一只⻘蛙,它在跳台阶时可以选择每次跳1级或者跳2级。如果有n级台阶,问这只⻘蛙跳上这个n级台阶有多少种不同的跳法。
举个例子来说明:假设有3级台阶,那么这只⻘蛙跳上这个3级台阶的不同跳法有几种?
- 跳1级,再跳1级,再跳1级:这种情况下,共跳了3次,一共有1种跳法。
- 跳1级,再跳2级:这种情况下,共跳了2次,一共有1种跳法。
- 跳2级,再跳1级:这种情况下,共跳了2次,一共有1种跳法。
所以,对于3级台阶,这只⻘蛙共有3种不同的跳法。
这个问题的解决可以使用递归或动态规划算法。递归方法如下:
#include <stdio.h>
int jumpWaysRecursive(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return jumpWaysRecursive(n - 1) + jumpWaysRecursive(n - 2);
}
}
int main() {
int n = 3;
printf("The number of ways the frog can jump %d steps is: %d\n", n, jumpWaysRecursive(n));
return 0;
}
C语言实现的动态规划方法的例子:
#include <stdio.h>
int jumpWays(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
int dp[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
int main() {
int n = 3;
printf("The number of ways the frog can jump %d steps is: %d\n", n, jumpWays(n));
return 0;
}
• 汉诺塔问题
汉诺塔问题是一个经典的递归问题,其问题描述为:有三根柱子(标记为A、B、C),在柱子A上从上到下按照大小顺序依次摆放着n个圆盘,要求把所有圆盘从柱子A移动到柱子C,期间可以借助柱子B,但要满足以下规则:
- 每次只能移动一个圆盘;
- 大圆盘不能放在小圆盘上面。
下面是一个使用C语言实现的递归方法来解决汉诺塔问题的例子:
#include <stdio.h>
void move(int n, char from_rod, char to_rod, char aux_rod) {
if (n == 1) {
printf("Move disk 1 from rod %c to rod %c\n", from_rod, to_rod);
return;
}
move(n - 1, from_rod, aux_rod, to_rod);
printf("Move disk %d from rod %c to rod %c\n", n, from_rod, to_rod);
move(n - 1, aux_rod, to_rod, from_rod);
}
int main() {
int n = 3; // Number of disks
move(n, 'A', 'C', 'B'); // A, B, and C are the names of rods
return 0;
}
在这个例子中,move
函数使用递归的方法来实现汉诺塔问题的解决。当只有一个圆盘时,直接将它从起始柱子移动到目标柱子即可;否则,先将前n-1个圆盘通过辅助柱子移动到辅助柱子上,然后将第n个圆盘移动到目标柱子上,最后再将前n-1个圆盘从辅助柱子移动到目标柱子上。在 main
函数中,我们可以设定圆盘的数量 n
,然后调用 move
函数来执行移动并打印出每一步的操作。