任务描述

在Python函数内部,我们可以去调用其他函数。所以如果一个函数在内部调用自身,这个函数我们就称为递归函数。本关我们将以汉诺塔的例子来感受递归函数的方法与应用。

汉诺塔问题源于印度一个古老传说。相传大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

本关目标就是通过对汉诺塔问题的探讨,让读者了解并掌握递归函数的相关知识。

相关知识

在编程语言中,如果一种计算过程的其中每一步都会用到前一步或前几步的结果,这个计算过程就可以称为递归的。而用递归计算过程定义的函数,则被称为递归函数。递归函数应用很广泛,例如连加、连乘及阶乘等问题都可以利用递归思想来解决。而汉诺塔问题也是递归函数的经典应用。

汉诺塔问题的解决思路:如果我们要思考每一步怎么移可能会非常复杂,但是可以将问题简化。我们可以先假设除a柱最下面的盘子之外,已经成功地将a柱上面的63个盘子移到了b柱,这时我们只要再将最下面的盘子由a柱移动到c柱即可。

当我们将最大的盘子由a柱移到c柱后,b柱上便是余下的63个盘子,a柱为空。因此现在的目标就变成了将这63个盘子由b柱移到c柱。这个问题和原来的问题完全一样,只是由a柱换为了b柱,规模由64变为了63。因此可以采用相同的方法,先将上面的62个盘子由b柱移到a柱,再将最下面的盘子移到c柱。

以此内推,再以b柱为辅助,将a柱上面的62个圆盘最上面的61个圆盘移动到b柱,并将最后一块圆盘移到c柱。

我们已经发现规律,我们每次都是以ab中一根柱子为辅助,然后先将除了最下面的圆盘之外的其他圆盘移动到辅助柱子上,再将最底下的圆盘移到c柱子上,不断重复此过程。

这个反复移动圆盘的过程就是递归,例如我们每次想解决n个圆盘的移动问题,就要先解决(n-1)个盘子进行同样操作的问题。

我们先假设a柱上只有3个圆盘,利用Python进行编程实现圆盘的移动,代码如下:

def move(n, a, b, c):if(n == 1):print(a,"->",c)returnmove(n-1, a, c, b)move(1, a, b, c)move(n-1, b, a, c)move(3, "a", "b", "c")

函数运行结果:

  1. a -> c
  2. a -> b
  3. c -> b
  4. a -> c
  5. b -> a
  6. b -> c
  7. a -> c

程序分析:

首先我们定义了一个函数move(n,a,b,c),参数n代表a柱上的圆盘个数,a,b,c三个柱子的顺序代表要将a柱上的圆盘最终移动到c柱上,然后b柱作为中间柱。

我们在递归函数中肯定会有终止递归的条件,24行的代码就是表示当a柱上的圆盘个数为1的时,就中止递归并返回,因为此时a柱上面只有一个圆盘的时候肯定就是直接把圆盘从a柱移动到c柱了。

5行的代码move(n-1, a, c, b)表示先得把a柱上的n-1个圆盘从a柱移动到b柱,这时c柱是中间辅助柱。

6行的代码move(1, a, b, c)就是条件n=1的时候,表示把a柱上剩下的1个最大圆盘从a柱移动到c柱。

7行的代码move(n-1, b, a, c)表示现在n-1个圆盘转移到要b柱上了,还是递归调用move函数,将n-1个圆盘从b柱移动到c柱,这时a柱是中间辅助柱。

最后我们调用move函数将3个圆盘从a柱移动到到c柱,当移动64个圆盘时,只需要将调用函数move(n,a,b,c)中的n变为64即可,这个计算量是十分巨大的,也只能交给计算机去解决。

小结:

我们通过汉诺塔的例子感受了递归函数的基本思路,并尝试解决了一个具体问题。递归函数的优点是定义清晰,思路简洁,能够极大简化编程过程。理论上,所有的递归函数都可以用循环的方法代替,但循环方法的编程过程要比递归函数复杂很多。

编程要求

本关的编程任务是补全src/step1/recursive.py文件的代码,实现相应的功能。具体要求如下:

  • 定义一个函数fact(n),实现的功能是对输入的正整数n进行n!运算。
  • 调用函数fact(n),对输入的正整数n进行阶乘运算,并输出计算结果。

测试说明

本关的测试文件是src/step1/recursive.py,测试过程如下:

  1. 平台自动编译生成recursive.exe;
  2. 平台运行recursive.exe,并以标准输入方式提供测试输入;
  3. 平台获取recursive.exe输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。

以下是平台对src/step1/recursive.py的样例测试集:

测试输入:
5
预期输出:
120

测试输入:
6
预期输出:
720

测试输入:
7
预期输出:
5040

测试输入:
8
预期输出:
40320

开始你的任务吧,祝你成功!

梦虽虚幻,却是自己的梦想;位虽低微,却是自己的岗位;屋虽简陋,却是自己的家;志虽渺小,却是自己的追求。

如果你觉得这一关的内容对你有帮助,请你在下面点赞。

参考答案

#coding=utf-8#输入正整数n
n = int(input())# 请在此添加代码,实现n!
#********** Begin *********#
def fact(n):if n == 1:res = 1else:res = n * fact(n - 1)return resprint(fact(n))#********** End **********#

Python入门之经典函数实例——第1关:递归函数 - 汉诺塔的魅力相关推荐

  1. educoder python入门之基础语法答案-Educoder Python入门之经典函数实例

    题目链接:https://www.educoder.net/tasks/py2izujr935h 第1关:递归函数 - 汉诺塔的魅力 #coding=utf-8 # 输入正整数n n = int(in ...

  2. educoder实训答案python_Educoder Python入门之经典函数实例

    题目链接:https://www.educoder.net/tasks/py2izujr935h 第1关:递归函数 - 汉诺塔的魅力 #coding=utf-8 # 输入正整数n n = int(in ...

  3. Linux 与 Python编程2021 经典函数实例 educoder实训

    第1关:递归函数 - 汉诺塔的魅力 编程要求 本关的编程任务是补全src/step1/recursive.py文件的代码,实现相应的功能.具体要求如下: 定义一个函数fact(n),实现的功能是对输入 ...

  4. 【Python】函数递归实例之字符串反转、汉诺塔问题分析

    递归的定义 函数定义中调用函数自身的方式 两个特性: 链条:计算过程存在递归链条 例如,n!=n*(n-1)!,n!与(n-1)!就构成了递归链条 基例:基础的实例,存在一个或多个不需要再次递归的基例 ...

  5. c语言函数调用数组_第七讲:C语言基础之函数,第二节,实现汉诺塔

    本文约2200字,主要讲了C语言基础之函数,递归,数组作为函数参数以及案例.练习题等. 带你进入C语言的世界,入门C语言,后边将持续更新.可以收藏学习.想了解C语言基础之函数,函数的基本概述,函数的调 ...

  6. 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题

    今天博主收一下线性表的尾,最近我们要学习的内容是栈和队列板块,栈和队列板块分为两讲,第一讲也就是今天我们主要学习栈的相关知识,包括栈的定义.栈的顺序表示及实现,栈的链式表示,栈的应用举例,以及栈递归实 ...

  7. 【小甲鱼Python】递归:这帮小兔崽子、汉诺塔课后作业

    笔记 斐波那契数列 汉诺塔 有64个盘子,三根柱子(从左至右依次为x,y,z柱).要求将这64个盘子从x移动到z上. 解决思想: 首先,将三根柱子依次分为起始柱,辅助柱和目标柱.在移动过程中,这三个柱 ...

  8. 函数的递归调用举例之汉诺塔问题模型

    目录 前言: ●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! 正文 汉诺塔(Tower of Hanoi)问题模型: 汉诺塔玩具模型                   ...

  9. Python基础语法函数——经典函数实例

    第1关:递归函数 - 汉诺塔的魅力 任务描述 在 Python 函数内部,我们可以去调用其他函数.所以如果一个函数在内部调用自身,这个函数我们就称为递归函数.本关我们将以汉诺塔的例子来感受递归函数的方 ...

最新文章

  1. 数字图像处理的三个层次
  2. python之路-网络编程
  3. VB:如何隐藏/显示treeview的ToolTips
  4. 纪录片.BBC.数据之趣.The.Joy.of.Data.2016
  5. server sql 将出生日期转为年龄_在sql server表中有一个出生日期字段我怎么才能在当前年份改变时自动更新年龄字段...
  6. sae 本地环境 mysql数据库_SAE本地环境与真实环境的差别
  7. Github | ICCV2019论文1000余篇更新!附下载链接
  8. 有感于“用界面线程去更新界面元素”
  9. android系统图标大小
  10. 打印浏览器文章为pdf
  11. JavaScript 原型精髓 #一篇就够系列
  12. 【已解决】vue项目地址栏的图标不显示
  13. atmega168p与328p_与Arduino“本是同根”——Atmel ATmega328P-XMINI开发板评测
  14. python 经典图书排行榜_书榜 | 计算机书籍(3.30-4.5)销售排行榜
  15. 【原创】关于改变电脑默认安装地址后桌面快捷键显示“指定路径不存在”错误的解决方法之一
  16. 同一工作组无法访问另一计算机,同一工作组无法访问如何解决【详解】
  17. Xmind 免费安装使用教程
  18. 《信创数据库选型专项测试用例》分享
  19. 《你必须知道的的495个C语言问题》阅读笔记-(第4章)指针篇
  20. 用php制作微信小程序,微信小程序 自己制作小组件

热门文章

  1. mysql数据表操作
  2. AES,DES,3DES加密方式的特点
  3. 同意词(SYNONYM)
  4. C#:表白程序(满屏玫瑰花)-让屏幕开满玫瑰花
  5. 《那些年啊,那些事——一个程序员的奋斗史》——62
  6. JS替换字符串,例:加号替换成‘%2B‘
  7. 10 微架构教务系统——用户登录、注销登录、学生注册接口
  8. Python长征路--反射
  9. 离散数学 第二章 谓词逻辑 2-6 前束范式
  10. 随机森林随机回归预测_使用随机森林预测幸福