首页 > 其他分享 >函数递归-汉诺塔问题

函数递归-汉诺塔问题

时间:2023-09-24 12:31:46浏览次数:43  
标签:函数 递归 hanoi 碟子 char 汉诺塔 移动

1.问题描述:

①有三根柱子X,Y,Z。X杆上有n只碟子

②每次移动一块碟子,小的只能叠在大的上面

③把所有碟子 从X杆 经Y杆 全部移动到Z杆上.

2.递归求解:

①n<=1

若只有一只碟子,直接X杆→Z杆;

②n>1

<1>把n-1只碟子按大小递减的次序 从X杆 经Z杆 移动到Y杆;

<2>将X杆上第n只碟子 移到Z杆;

<3>然后再将n-1只碟子按大小递减的次序 从Y杆 经X杆 移动道Z杆。


函数递归-汉诺塔问题_汉诺塔问题


递归体 - 程序中自相似的部分:

·移动n-1只碟子和移动n只碟子的过程是相似的。

·但是这个过程不完全一样,因为盘子插入的杆子变了。

递归的出口 - 递归终止的语句:

·n=1时。

·只剩下1个碟子,直接移动到Z杆即可。


整体大概思路如图:

函数递归-汉诺塔问题_#define_02

代码编写如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void hanoi(int, char, char, char);
void move(char, char);
int main()
{
    int n;
    printf("Please input n:");
    scanf("%d", &n);
    hanoi(n, 'a', 'b', 'c');
    return 0;
}
//n个盘子,从x移动到z,用y作临时存放
//            个数     从      经由     到
void hanoi(int n, char x, char y, char z)
{
    if (n == 1)
        move(x, z);
    else
    {
        hanoi(n - 1, x, z, y);
        move(x, z);
        hanoi(n - 1, y, x, z);
    }
}
//显示盘子的移动轨迹
void move(char c1, char c2)
{
    printf("%c → %c\n", c1, c2);
}

三级汉诺塔运行结果如下:

函数递归-汉诺塔问题_C语言_03


具体的有关该程序的汉诺塔递归调用过程可参考下面的链接:

懒猫老师-C语言-汉诺塔问题详解(hanoi)



标签:函数,递归,hanoi,碟子,char,汉诺塔,移动
From: https://blog.51cto.com/u_16247982/7585360

相关文章

  • int (*s[10]) (int);含义,函数指针。
    问题int(*s[10])(int);含义是什么?答案是一个包含10个函数指针的数组的声明。示例一般情况看到的函数指针如下:intfun1(int);//这是一个函数声明int(*pf)(int);//声明了一个函数指针pf=fun1;//将函数的地址赋值给pf。这里的函数指针仅有一个pf,而问题中是用数组存放函......
  • 无涯教程-JavaScript - PERCENTRANK.INC函数
    描述PERCENTRANK.INC函数返回数据集中的值的排名,作为数据集的百分比(包括0..1)。此功能可用于判断数据集中值的相对位置。语法PERCENTRANK.INC(array,x,[significance])争论Argument描述Required/OptionalArrayThearrayorrangeofdatawithnumericvaluesthat......
  • 递归 (比较5个数的大小)
    #include<bits/stdc++.h>usingnamespacestd;intmax(inta[],intn){ intt; if(n==1){ t=a[1]; }else{ if(max(a,n-1)>a[n]){ t=max(a,n-1); }else{ t=n[a]; } } returnt;}intmain(intargc,char**argv){ inta[6]; for(inti=0;i......
  • 递归求最大值
    #include<bits/stdc++.h>usingnamespacestd;intt,n,a;intf(intn[],inta){ if(a==1){ t=n[1]; }else{ if(f(n,a-1)>n[a]){ t=f(n,a-1); }else{ t=n[a]; } } returnt;}intmain(){ intn[6],x; for(inti=0;i<5;i++){ cin>&g......
  • crash —— 如何查看数据是什么类型以及函数原型
    在crash中可以用whatis命令查看数据类型信息以及函数的原型。如果想知道某个数据是什么类型那么可以用下面的方法:查看结构体的定义crash>whatismm_structstructmm_struct{struct{structmaple_treemm_mt;unsignedlong(*get_unmapped_area)(str......
  • 递归求最大值
    #include<iostream>usingnamespacestd;intf(inta[],intn){ intt; if(n==1){ t=a[1]; }else{ if(f(a,n-1)>a[n]){ t=f(a,n-1); }else{ t=a[n]; } } returnt;}intmain(){ inta[6]; for(inti=1;i<=5;i++){ cin>>a[i]; ......
  • C语言学习记录---函数3
    声明#include<stdio.h>#include<string.h>#include<windows.h>#include<stdlib.h>#include<time.h>#include<math.h>7.3递归与迭代7.3.1练习3:求n的阶乘。(不考虑溢出)参考代码:intFacl(intn){if(n>1){returnn=n*Facl......
  • stat函数详解
    Linux系统函数之文件系统管理stat函数作用:获取文件信息include<sys/types.h>#include<sys/stat.h>#include<unistd.h>函数原型intstat(constchar*path,structstat*buf)返回值:成功返回0,失败返回-1;参数:文件路径(名),structstat类型的结构体structstat结构体详......
  • async函数-await
    await必须用在被async修饰的函数内(因为await会阻塞代码,但是阻塞的范围要限制在async函数执行的范围内)箭头函数中,添加async函数要写在参数的前面await是在异步函数内部使用的关键字,用于等待一个Promise对象的解决(成功)或拒绝(失败)。当使用await关键字时,它会暂停函数......
  • 偏函数
    Python中的偏函数是函数式编程强大工具,主要是减少函数调用的复杂性。可以理解为,将现有函数在某些参数固定下来,构造成一个新的函数。新函数就不用写那么多参数了。'''偏函数'''fromfunctoolsimportpartialdefadd(a,b):sum=a+breturnsumif__name__=='......