内涵可用程序 和实验结果截图
这是一个递归调用的例子
#include "stdio.h" //基础输入输出用的头文件
void hanoi(int n,int x,int y,int z) //打印移动盘子的函数,递归调用的
{
if (n==1) //如果只有一个盘子,很简单,直接把盘子从X移动到Z就结束了
printf("%c-->%c\n",x,z); //打印“x-->z”,就是上面说的
else //否则,盘子数大于1
{
hanoi(n-1,x,z,y); //我们首先要用hanoi函数把n-1个盘子借助Z,从X移动到Y上
printf("%c-->%c\n",x,z); //再把最后一个盘子,从X直接移动到Z上
hanoi(n-1,y,x,z); //然后把n-1个盘子,借助X,从Y移动到Z上
汉诺塔问题是一个经典的递归算法问题,源自印度的一个古老传说。它涉及到三根柱子(通常标记为A、B、C)以及不同大小的圆盘,这些圆盘在初始时都堆放在第一根柱子(A)上,按照从小到大的顺序自上而下排列。目标是将所有圆盘移动到第三根柱子(C),同时遵守以下规则:
1. 每次只能移动一个圆盘。
2. 不允许大盘子位于小盘子之上。
汉诺塔问题的C++实现通常通过递归函数来完成。在这个例子中,有两个不同的实现,但它们的核心思想是一致的。
我们看第一个实现。这个程序使用了`hanoi`函数作为递归主体,接受三个参数:n(表示剩余需要移动的盘子数量),x(当前柱子,即起始柱子),y(辅助柱子),z(目标柱子)。当n等于1时,表示只有一个盘子,可以直接从x移动到z。如果n大于1,那么首先递归地将n-1个盘子从x通过y移动到z,接着将最大的盘子从x直接移动到z,最后再次递归地将n-1个盘子从y通过x移动到z。
第二个实现中,`move`函数用于记录每次圆盘的移动,`hanoi`函数同样负责递归操作。它接受四个参数:n(盘子数)、one(起始柱子)、two(辅助柱子)、three(目标柱子)。当n为1时,直接移动圆盘;否则,先将n-1个盘子借助two从one移动到three,再将one上的最后一个盘子移动到three,最后将n-1个盘子借助one从two移动到three。
两个实现都利用了递归的性质,即解决问题的子问题与原问题具有相同的形式。在汉诺塔问题中,每次都将问题规模缩小1(减少一个盘子),直到只剩下一个盘子时,问题变得直接可解。然后通过递归返回,逐步解决更大的问题,直到所有盘子都移动到目标位置。
递归函数的关键在于找到正确的递归基(base case),在这个问题中是n=1的情况,以及递归步骤,即如何通过较小规模的问题来解决当前问题。汉诺塔问题的解决方案展示了递归在处理分治策略问题中的强大能力,同时也展示了如何将复杂问题分解为更简单的子问题。通过这两个示例,我们可以深入理解递归的思想,并将其应用到其他需要类似处理的编程问题中。