汉诺塔递归调用(C语言实现)

汉诺塔递归调用(C语言实现)1 递归算法递归算法 是一种直接或者间接地调用自身的算法 在计算机编写程序中 递归算法对解决一大类问题是十分有效的 它往往使算法的描述简洁而且易于理解 递归过程一般通过函数或子过程来实现 递归算法的实质 是把问题转化为规模缩小了的同类问题的子问题 然后递归调用函数 或过程 来表示问题递归算法解决问题的特点 1 递归就是在过程或函数里调用自身 2 在使用递归策

预备知识

1.递归算法

递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归过程一般通过函数或子过程来实现。

递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题

递归算法解决问题的特点:

  (1) 递归就是在过程或函数里调用自身。

  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

  (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢.

导入汉诺塔问题:

汉诺塔递归调用(C语言实现)

动态演示:

汉诺塔递归调用(C语言实现)

汉诺塔是典型的递归问题,这个问题可以这样描述:

完成目标:将n个block块从A搬运到C,求需要移动多少次完成?

约束条件:搬运的过程中每次只能移动一个block块,且不能出现大的block块在小的block块之上。

 

2.汉诺算法分析

算分法析:

 

汉诺塔递归调用(C语言实现)

 

汉诺塔递归调用(C语言实现)

 

汉诺塔递归调用(C语言实现)

 

接着通过递归递归算法就完成了。如果第一遍没懂,仔细读三四遍应该就没问题了。

3.实现代码

#include 
  
    #include 
   
     /* 算法思路:1将 n-1个盘子先放到B座位上 2.将A座上地剩下的一个盘移动到C盘上 3、将n-1个盘从B座移动到C座上 */ //函数声明 void move(char x, char y); void hannuo(int n,char one ,char two,char three) { if(n==1)move(one, three); //递归截止条件 else { hannuo(n-1,one ,three,two);//将 n-1个盘子先放到B座位上 move(one,three);//将A座上地剩下的一个盘移动到C盘上 hannuo(n-1,two,one,three);//将n-1个盘从B座移动到C座上 } } void move(char x,char y) { printf("%c--->%c",x,y) } int main() { int n; printf("input your number"); scanf("%d",&n); hannuo(n,'A','B','C'); return 0; } 
    
  

进一步深入学习:

https://lyl0724.github.io/2020/01/25/1/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214647.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:46
下一篇 2026年3月18日 下午3:46


相关推荐

  • java中的向上取整和向下取整

    java中的向上取整和向下取整向上取整:比自己大的最小整数。向下取整:比自己小的最大整数。publicclassRoundingUp{publicstaticvoidmain(String[]args){System.out.println(Math.ceil(1.5));//2.0System.out.println(Math.ceil(-1.5));//…

    2022年6月21日
    67
  • 数据库系统概论(第5版)

    数据库系统概论(第5版)个人读书笔记用书 王珊 萨师煊编著 数据库系统概论 第 5 版 第 1 章绪论操作系统是管理硬件的 数据库是管理数据的 fontsize 3 本章重点 1 概念模型的基本概念 主要建模方法 E R 图 2 关系数据模型相关概念 数据库系统三级模式和两层映射的体系结构 3 逻辑独立性和物理独立性等 本章难点 基本概念 数据模型 数据库系统体系结构 1 1 数据库系统概述数据库的 4 个基本概念 数据 Data 描述事物 fontsize 3

    2026年3月18日
    2
  • Android怎么查看手机中的本地数据库

    Android怎么查看手机中的本地数据库我前几天做的项目中有本地数据库,所以就用的SQLite,在调试数据库时,,很想看一下里面的表结构是否正确,这个时候就十分苦恼,因为这个db文件不能够直接拿出来,我们知道,在DDMS里面有一个FileExplorer,它里面保存着手机中的各个文件夹,但是尝试打开里面的文件夹的时候,却发现怎么点都没有东西,于是我就十分不解,明明我写了数据库,为什么没找到这个文件呢?后来发现其实是没有权限。下面需要注意…

    2022年5月31日
    45
  • 即梦指令教程

    即梦指令教程

    2026年3月13日
    1
  • [C#] 走进 LINQ 的世界

    [C#] 走进 LINQ 的世界走进LINQ的世界序在此之前曾发表过三篇关于LINQ的随笔:进阶:《LINQ标准查询操作概述》(强烈推荐)技巧:《LinqToObjects-如何操作字符串》 和

    2022年7月2日
    21
  • rematch常用插件介绍

    rematch常用插件介绍插件系统 rematch 实现了一个插件系统 内置了 dispatch 和 effects 两个插件 分别用来增强 dispatch 和处理异步操作 rematch 的插件 要符合 rematch 的要求 每个插件返回一个对象 这个对象可以包含几个属性 用来在不同的生命周期中对 store 进行操作 对于每一个插件对象 提供了如下几个属性进行配置 onInit 进行插件的初始化工作 config 对 rematch 进行配置

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号