c++递归解决汉诺塔问题

简介: c++递归解决汉诺塔问题

image.png

汉诺塔是一个益智游戏,就是有三根柱子,然后有一堆圈圈,圈圈有大小之分,大的圈圈必须在小的上面。现在需要做的是将所有的圈圈从1个柱子完全地移动到另外一个柱子上面。

汉诺塔是一个经典的递归问题。

(1)     把n-1个盘子由A 移到 B;(C为过渡盘)

(2)     把第n个盘子由 A移到 C;

(3)     把n-1个盘子由B 移到 C;(A为过渡盘)

void  han(int n,char a,char b,char c)
    {
        if(n==1)//这是递归出口,
        {
           
            move(a,c); 
        }
        else   //这就是当n>1考虑的情况
        {
            han(n-1,a,c,b); 
            move(a,c);  
            han(n-1,b,a,c); 
        }

    }

void move(char a,char b)//定义私有化成员函数,只允许本类成员调用
    {
        cout<<"由"<<a<<"-->"<<b<<endl;
    }

han(3,'a','b','c')

当n=1只需要将第一个位置和第三个位置移动就行了,这里是递归的出口。然后剩下的按照递归的规律去进行就好了。

image.png

上面是3个数量的圈圈在a柱子上面完全移动到c柱子上面的运行结果。即使数量提升了也没关系,我们只需要把han(3,'a','b','c')中的3改为圈圈的数量就行,然后再按照计算机运行的结果做一次,那就可以移动出来。

欢迎和我讨论有关程序的问题,也可以答疑。关注公众号:诗一样的代码,交一个朋友。

相关文章
汉诺塔问题(递归)/梵塔问题c++
汉诺塔问题(递归)/梵塔问题c++
|
7月前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
381 3
|
6月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
7月前
|
C++
C++ 递归与面向对象编程基础
C++ 递归是函数自我调用的技术,用于简化复杂问题。以递归求和为例,`sum` 函数通过不断调用自身累加数字直到 `k` 为 0。递归需谨慎,避免无限循环和资源浪费。面向对象编程(OOP)将程序划分为交互对象,具有属性和方法,提升代码复用、维护和扩展性。C++ OOP 基本概念包括类、对象、属性和方法。通过创建类和对象,利用点语法访问成员,实现代码组织。
50 0
|
7月前
|
Java Go Python
Golang每日一练(leetDay0103) 区域和检索1~3
Golang每日一练(leetDay0103) 区域和检索1~3
61 0
Golang每日一练(leetDay0103) 区域和检索1~3
|
7月前
|
Java Go C++
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
59 0
C/C++每日一练(20230424) 只出现一次的数字、有效的括号、递归反序正整数
|
7月前
|
算法 C++ Java
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
50 0
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
|
存储 C++
二叉搜索树详解以及C++实现二叉搜索树(递归和非递归)
二叉搜索树详解以及C++实现二叉搜索树(递归和非递归)
69 0
|
机器学习/深度学习 设计模式 C++
C++模板元模板实战书籍讲解第一章(奇特的递归模板式以及小结和题目)
C++模板元模板实战书籍讲解第一章(奇特的递归模板式以及小结和题目)
84 0