函数的递归调用 递归函数 C++求汉诺塔问题

3 篇文章 0 订阅

递归:

在函数的调用中,有一种特殊的情况,比如一个函数直接的间接的调用自身,称其为函数逇递归调用。

递归调用有两种形式:

直接递归:在一个函数中调用自身

间接递归:在一个函数中调用其他函数,而在其他函数中又调用了本函数

 

递归调用主要包含两个步骤:递推和回归,我们利用函数的递归调用,分解为相对简单而且可以直接求解的子问题(递推阶段)然后这个子问题的结果逐层进行回带求职,最终求得原来复杂问题的解(回归阶段)

 

注意:

递归算法设计简单,但是相比较非递归耗时和占内存

设计一个正确的递归过程需要注意此过程需满足递归条件,需具备递归结束条件

最后,通常递归函数常用来计算阶乘、级数、指数运算。

 

举个例子求数的阶乘

代码如下:

#include<iostream>

using namespace std;

 

//使用递归调用 打印函数阶乘

 

int  Fac(int n) {

 

if (n < 0) {

cout << "error" << endl;

return(-1);

}

else if (n <= 1) {

 

return(1);

}

else {

return(n*Fac(n - 1));

 

}

}

int main() {

int Fac(int n);

int n;

cout << "please input n:" << endl;

cin >> n;

cout << "n!=" << Fac(n) << endl;

 

system("pause");

return 0;

 

}

 

 

 

 

汉诺塔问题

问题描述

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上

 

刚好看B站的时候看到李永乐老师说过这个问题。感兴趣的小伙伴可以去看看

https://www.bilibili.com/video/BV1gJ41177fX/?spm_id_from=333.788.videocard.0

 

如果一共64层我们按照分析结果一共有1800亿亿步,如果我们一秒钟移动一次,需要5800亿年,宇宙形成到现在只有 138亿年。所以说为了简单点。我们只考虑4层的情况    

代码如下:             

#include <iostream>
using namespace std;

void hanoi(int N, char A, char B, char C)
{
    if (N == 1)//在只有一个盘子的情况下,直接从A到C
        cout << A << "-->" << C << endl;
    else
    {//接下按照前面分析的,将前N-1(3)个借助C移到B上
        hanoi(N - 1, A, C, B);
        cout << A << "-->" << B<< endl;//将第n(4)个移到C上
    //对前N-1个递归操作
        hanoi(N - 1, B, A, C);//将对B上的前N-1(3)个借助A,移到C上,结束
    }
}
 
int main()
{
    int N;
    cout << "请输入所要移动盘子的个数:" << endl;
    cin >> N;
    cout << "移动步骤如下:" << endl;
    hanoi(N, 'A', 'B', 'C');
    system("pause");

    return 0;
}

               

结果:

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值