!/usr/bin/env python3

-- coding: utf-8 --

利用递归函数计算阶乘

N! = 1 * 2 * 3 * ... * N

def fact(n):

if n == 1:

return 1

return n * fact(n-1)

print('fact(1) =', fact(1))

print('fact(5) =', fact(5))

print('fact(10) =', fact(10))

利用递归函数移动汉若塔:

def move(n, a, b, c):

if n == 1:

print('move', a, '-->', c) # 只有一个时,从 A 搬到 C

else:

move(n-1, a, c, b) # 否则,先将前 n-1 个搬到 B

move(1, a, b, c) # 将剩下的一个从 A 搬到 C

move(n-1, b, a, c) # 将 B 上的 n-1 个搬到 C

汉诺塔递归,每次递归的思想都是将n-1个放置到另一个空位上去

进行到n-1个开始后,a/b/c顺序会改变,但此时,仍要按照公式里的来排序,简单点来说就是将abc顺序调换

move(3, 'A', 'B', 'C')

print('============')

move(4, 'A', 'B', 'C')

执行move(3, 'A', 'B', 'C')时,第一步是判断,n是否等于1

不等于1,执行else

得到结果

move(2, a, c, b)

move(1, a, b, c)

move(2, b, a, c)

=============

此时递归已经形成:

先执行第一个move(2, a, c, b)

这里就是我最开始的误区:

[下面的是错误的展示]

move(2-1, a, c, b)

move(1, a, b, c)

move(2-1, b, a, c)

这里犯了一个很低级的错误

在定义的函数里,a/b/c三个分别代表的是第一个柱子,第二个柱子,第三个柱子

也就是说,这里的abc是代表的位置,但我执行到n-1步时,还认为应该直接套用公式,这里就出现问题了

所以,正确的应该是:

move(1, a, b, c) 对应的结果是a --> c

move(1, a, c, b) 对应的结果是a --> b

move(1, c, a, b) 对应的结果是c --> b

这里写的时候,感觉有点乱,我的方法是:

写下a c b此时应执行的顺序,然后按照1 2 3位置来排序

1 3 2,即2 3位置调换

1 2 3,位置不变

2 1 3, 即1 2位置调换

=============

同理,执行move(2, b, a, c)

move(1, b, c, a) 对应的结果是b --> a

move(1, b, a, c) 对应的结果是b --> c

move(1, a, b, c) 对应的结果是a --> c

=============

最后将上述结果组合下

move(1, a, b, c) 对应的结果是a --> c

move(1, a, c, b) 对应的结果是a --> b

move(1, c, a, b) 对应的结果是c --> b

move(1, a, b, c) 对应的结果是a --> c

move(1, b, c, a) 对应的结果是b --> a

move(1, b, a, c) 对应的结果是b --> c

move(1, a, b, c) 对应的结果是a --> c

=============

由此就形成了递归的效果

函数的思路很简单:

就是将n-1个看成整理

先将n-1个移动到中间的位置上去

然后移动最下面的(第n个)到最右边的位置上去

然后把n-1个(被看做整体的)移动到最右边的位置上去

汉诺塔python3函数编写和过程分析的更多相关文章

  1. 汉诺塔问题C++实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下进行汉诺塔问题的递归实现 #include <iostream.h> int gb ...

  2. [Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  3. [Python3 练习] 005 汉诺塔1 递归解法

    题目:汉诺塔 I (1) 描述 传说,在世界中心贝拿勒斯(在印度北部)的圣庙外有左中右三根足够长的柱子(塔) 左边柱子上套着 64 片金片,金片按"上小下大"排,其余两根是空柱子 ...

  4. python3汉诺塔简单实现代码

    小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1 ...

  5. Go基础之函数递归实现汉诺塔

    Go递归实现汉诺塔 package main import "fmt" // a 是源,b 借助, c 目的长度 func tower(a, b, c string, layer ...

  6. Python使用函数模拟“汉诺塔”过程

    运行效果: 源代码: 1 # -*- coding:utf-8 -*- 2 ##汉诺塔游戏开始 3 _times=0 #用于统计移动次数 4 def hannuota(nlist,mfrom,mpas ...

  7. "递归"实现"约瑟夫环","汉诺塔"

    一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...

  8. python下实现汉诺塔

    汉诺塔是印度一个古老传说的益智玩具.汉诺塔的移动也可以看做是递归函数. 我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为: 如果a只有一个圆盘,可以直接移动到c: 如果a有N个圆盘,可以 ...

  9. 从"汉诺塔"经典递归到JS递归函数

    前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来 ...

随机推荐

  1. 用json方法来作深拷贝应该知道的一点东西!

    之前写js比较多的的时候也写过深拷贝,浅拷贝,继承啥的,还有自定义的监听事件.然而过了很久都忘了. 最近在项目上用的深拷贝都是 b = JSON.parse( JSON.stringify(a) ) ...

  2. Java Web应用集成OSGI

    对OSGI的简单理解 就像Java Web应用程序需要运行在Tomcat.Weblogic这样的容器中一样.程序员开发的OSGI程序包也需要运行在OSGI容器中.目前主流的OSGI容器包括:Apach ...

  3. JavaSE(一)之类与对象

    终于到了要学习面向对象程序设计了,其中可能很多东西以前都知道怎么去用,但是却不知道怎么来的,或者怎么样写会出错,所以今天总结起来. 一.OOP概述 Java的编程语言是面向对象的,采用这种语言进行编程 ...

  4. 树和二叉树的存储结构的实现(C/C++实现)

    存档: #include <iostream.h> #include <stdio.h> #include <stdlib.h> #define max 20 ty ...

  5. hackerrank Diameter Minimization

    瞬间移动 题意:构造一个所有点出度都为m的有向图最小化图的直径. 显然转成m进制来做就好了. #include<queue> #include<cstdio> #include ...

  6. UVA 1030 - Image Is Everything【模拟+思维+迭代更新】

    题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...

  7. 51Nod 1277 字符串中的最大值(KMP,裸题)

    1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如: ...

  8. qt creator 中的"提升为..."功能简介

    1.新建一个项目 2.打开文件:mainwindow.ui ->拖一个 tree widget 控件到画布->右击弹出对话框->单击"提升为..."选项 3.输入 ...

  9. [国嵌攻略][154][Linux-I2C子系统]

    IIC子系统架构 device driver层: 1.device driver,由用户开发. 2.i2c-dev由内核实现,但是需要配合应用模式驱动才能使用. i2c core层: 1.总线驱动,也 ...

  10. oracle设置自动增长序列

    我们在用MS SQL Server时,可以为表的主键设置为自动加1的效果;但是在Oracle当中,我们是无法直接设置一个字段为自动加1,需要先建立一个Sequence,然后为这个表创建一个Trigge ...