数据结构基础(6)--递归和函数调用--汉诺塔问题C语言实现

函数调用

通常,当一个函数运行期间调用另一个函数时,在运行被调函数之前,系统需要完成3件事:

(1)将所有的实参,返回地址(个人理解是调用被调函数时的下一个语句的地址)等信息传递给被调函数保存。

(2)为被调函数的局部变量分配存储空间。

(3)将控制转移到被调函数入口。

从被调函数返回调用函数之前,系统完成3件事:

(1)保存被调函数的计算结果。

(2)释放被调函数的数据区。

(3)依照被调函数保存的返回地址,将控制转移到调用函数。

递归:

一个函数自己直接或间接调用自己。

思想就是:将问题规模不断缩小,化繁为简,求n!转化成(n-1)!,再转换成(n-2)!.......最后转换成(1)!.

有如汉诺塔问题,如果初始有10个砝码,要从A移动到C,这个看起来比较复杂。只要把前9个移动到B,然后移动第10个到C。那这9个怎么移动呢,也用这种方式。。。这就是递归实现汉诺塔详细代码见最下方

循环和递归比较:

递归:

易于理解

速度慢

存储空间大

循环

不易于理解

速度快

存储空间小

递归应用:

1.求阶乘

2.1+2+3+4+。。。+100的和

3.汉诺塔

4.走迷宫(CS的实现)

递归的运用:

树和森林就是以递归的方式定义的

树和图的很多算法都是以递归来实现的

很多数学公式就是以递归的方式定义的

斐波拉契序列

12 3 5 8 13 21 34。。。

C语言实现汉诺塔:

#include<stdio.h>

void hanota(int num,char A,char B,char C)
{
 //如果只有一个元素,那么直接把这个元素,移动到C
 if(1==num)
 {
     printf("把第%d个元素从%c移动到%c\n",num,A,C);
 }else{
 //如果不是第一个元素,先把前n-1个元素,借助C移动到B
   hanota(num-1,A,C,B);
 //然后把A最下面的元素移动到C
   printf("把第%d个元素从%c移动到%c\n",num,A,C);
   //然后再把B上的元素借助A移动到C
   hanota(num-1,B,A,C);
 }
}
int main()
{
    char A='A';
    char B='B';
    char C='C';
    hanota(3,A,B,C);
    return 0;
}

现实生活中,如果我们解决的问题比较繁琐,不妨把问题规模减小考虑。

时间: 2024-10-11 16:48:05

数据结构基础(6)--递归和函数调用--汉诺塔问题C语言实现的相关文章

递归--练习2--noi6261汉诺塔

递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面. 这是一个著名的问题,几乎所有的教材上都有这个问题.由于条件是一次只能移动一个盘,且不允许大盘放

编程:递归编程解决汉诺塔问题(用java实现)

//Li Cuiyun,October 14,2016.//用递归方法编程解决汉诺塔问题package tutorial_3_5;import java.util.*; public class HanoiTower { public static void main(String[] args) { // TODO Auto-generated method stub @SuppressWarnings("resource") Scanner sc=new Scanner(Syste

经典递归小程序--汉诺塔

#include <stdio.h> /* 思路:1.将1到n-1号盘子借助C移到B上 2.将n号盘子移到C上 3.将1到n-1号盘子借助A移到C上 */ //初始化步数 int i = 0; void move(int,char,char); void hannuota(int,char,char,char); void main(void){ int n; printf("请输入汉诺塔盘子的个数:"); scanf("%d",&n); han

Python算法 - 递归精解 - 汉诺塔问题

汉诺塔问题 题意 将A 柱子上的块转移到 C 上 条件1  -  每次只能转移一块 条件2  -  大块不能压小快 解析 概念原理 冰箱装大象问题 : 1. 打开冰箱 2. 放入大象 3. 关上冰箱 类比在 任何一个块 n 来说: 1. 把上面的块都移动好 2. n 块移动过去 3. 之前上面的块在放在 n 块上面 简化问题, 考虑 123块的移动, 可以考虑成我想移动 3 . 必然要移动12 同理 我想移动 2, 必然要移动 1 , 即关系为 f(3) ---> f(2) ---> f(1)

关于C++的递归(以汉诺塔为例)

关于C++,hanoi塔的递归问题一直是个经典问题,我们学习数据结构的时候也会时常用到, 因为它的时间复杂度和空间复杂度都很高,我们在实际的应用中不推荐使用这种算法,移动n个盘子, 需要2的n次幂减一步,例如:5个盘子,31步:10个盘子,1023步. 下面,是我整理的有关C++递归的代码实现过程,希望对大家的学习有所帮助. #include <iostream> using namespace std; //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int step=1;//记

郝斌--数据结构---汉诺塔实现(c语言实现)

1 #include <stdio.h> 2 3 void hannuota(int n,char A,char B,char C)//表示A借助于B移到C 4 { 5 /* 6 如果是1个盘子 7 直接将柱子上的盘子从A移到C 8 否则 9 先将A柱子上的n-1个盘子从C移到B 10 直接将A柱子上的盘子从A移到C 11 最后将B柱子上的n-1个盘子借助A移到C 12 */ 13 if(1 == n) 14 { 15 printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n

汉诺塔的C语言实现

完整代码如下: /*  * this file is the implementation of hanoi game  * file name: hanoi.c  * author: John Woods  * date: 2015/05/30  * statement: anyone can use this file for any purpose  */ #include <stdio.h> #include <stdlib.h> //function declaratio

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

汉诺塔-递归

有三根柱子A,B,C A柱子上穿着N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要将所有圆盘移至C柱子,遵循以下规则: 1. 每次只能移动一个圆盘: 2. 小的上面不能放大的. 拆解问题,N个盘子,把最下面的那个大的看做地面,看成不存在,问题变为N-1汉诺塔问题 把下面两层看做不存在,就是N-2.... 方法就是: 先移动一个盘子(解决1汉诺塔问题) 在此基础上,解决2汉诺塔问题 .... .... 解决N-1汉诺塔问题 最终解决N汉诺塔问题 当然,递归是倒过来的,虽然思维是倒过来的,但实际