递归问题小结

1. 定义

一个直接调用自己或者通过一系列的调用语句间接调用自己的函数,称作递归函数。

2. 经典的递归实现——n阶Hanoi塔问题

描述:假设有三个命名为A,B,C的塔座,在塔座X插有n个直径大小各不相同你、依小到大编号为1,2,,,n的圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循以下规则:

1)每次只能移动一个圆盘;

2)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

分析:

1)当n=1时,只需要把编号为1的圆盘从X移到Z;

2)当n>1, 应将压在编号为n上面的n-1个圆盘从X移到Y,在将编号为n的圆盘从X移到Z,然后将塔座Y上的n-1个圆盘移至Z。

递归函数 hanoi()

//汉诺塔递归函数
void hanoi(int n,char x,char y,char z){
    if(n == 1){
        move(x,1,z);        //将编号为1的圆盘从x移到z
    }
    else{
        hanoi(n-1,x,z,y);   //将x上编号为1至n-1的圆盘移到y,z作为辅助塔
        move(x,n,z);        //将编号为n的圆盘从x移到z
        hanoi(n-1,y,x,z);   //将y上编号为1至n-1的圆盘移到z,x为辅助塔
    }
}

        这是一个递归函数,在函数执行过程中,需要多次进行自我调用。在高级语言编制的程序中,调用函数和被调用函数之间的链接及信息交换需通过栈来进行。

测试函数

#include <iostream>

using namespace std;

void move(char x,int n,char z){
    static int count = 0;
    printf("Step %2d: move disk%d from %c to %c",++count,n,x,z);
    cout<<endl;
}

void hanoi(int n,char x,char y,char z){
    if(n == 1){
        move(x,1,z);        //将编号为1的圆盘从x移到z
    }
    else{
        hanoi(n-1,x,z,y);   //将x上编号为1至n-1的圆盘移到y,z作为辅助塔
        move(x,n,z);        //将编号为n的圆盘从x移到z
        hanoi(n-1,y,x,z);   //将y上编号为1至n-1的圆盘移到z,x为辅助塔
    }
}

int main(){
    hanoi(4,'A','B','C');
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值