C语言从入门到精通(鹏哥带你C语言从入门到精通,谭浩强C语言教程C语言程序设计C

经典汉诺塔问题
以下是一个使用 C 语言编写的经典汉诺塔问题的代码,并附有注释解释每个步骤的含义:
#include <stdio.h> // 汉诺塔函数,从柱子A移动n个盘子到柱子C,借助柱子B void hanoi(int n, char from_peg, char to_peg, char aux_peg) { if (n == 1) { printf("移动盘子 1 从 %c 到 %c\n", from_peg, to_peg); return; } // 将上面 n-1 个盘子从 A 移动到 B,借助 C hanoi(n - 1, from_peg, aux_peg, to_peg); // 移动第 n 个盘子从 A 到 C printf("移动盘子 %d 从 %c 到 %c\n", n, from_peg, to_peg); // 将 n-1 个盘子从 B 移动到 C,借助 A hanoi(n - 1, aux_peg, to_peg, from_peg); } int main() { int n; printf("请输入盘子的数量:"); scanf("%d", &n); printf("在汉诺塔游戏中的步骤如下:\n"); hanoi(n, 'A', 'C', 'B'); // 从柱子 A 移动 n 个盘子到柱子 C,借助柱子 B return 0; }
在这个代码中,hanoi
函数使用递归来解决汉诺塔问题。主要思路是将 n-1 个盘子从 A 移动到 B,然后移动第 n 个盘子从 A 到 C,最后将 n-1 个盘子从 B 移动到 C。每次移动都会打印出移动的盘子编号和移动的来源与目标柱子。
在 main
函数中,用户输入要移动的盘子数量,然后调用 hanoi
函数开始解决汉诺塔问题。
青蛙跳台阶问题
青蛙跳台阶问题是一个经典的递归问题,描述了一只青蛙跳上 n 个台阶的跳法数量。每次青蛙可以跳跃 1 个台阶或 2 个台阶。要求编写一个函数来计算给定 n 个台阶时青蛙的跳法数量。
这个问题可以使用递归来解决。青蛙在跳上第 n 个台阶时,有两种方式:从第 n-1 个台阶跳一步,或从第 n-2 个台阶跳两步。因此,总的跳法数量等于跳上第 n-1 个台阶和跳上第 n-2 个台阶的跳法数量之和。
以下是使用 C 语言编写的解决青蛙跳台阶问题的代码:
#include <stdio.h> // 计算青蛙跳上 n 个台阶的跳法数量 int jump(int n) { if (n <= 0) { return 0; // 无台阶可跳,返回 0 } else if (n == 1) { return 1; // 一个台阶,只有一种跳法 } else if (n == 2) { return 2; // 两个台阶,有两种跳法:1 + 1 或 2 } else { // 递归计算跳上 n-1 和 n-2 个台阶的跳法数量之和 return jump(n - 1) + jump(n - 2); } } int main() { int n; printf("请输入台阶的数量:"); scanf("%d", &n); int ways = jump(n); printf("青蛙跳上 %d 个台阶的跳法数量为:%d\n", n, ways); return 0; }
在这个代码中,jump
函数使用递归来计算跳上 n 个台阶的跳法数量。在 main
函数中,用户输入要跳的台阶数量,然后调用 jump
函数来计算跳法数量,并输出结果。需要注意,递归解法会存在重复计算的问题,可以通过动态规划或迭代来优化。