汉诺塔python3函数编写和过程分析
!/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函数编写和过程分析的更多相关文章
- 汉诺塔问题C++实现
		
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下进行汉诺塔问题的递归实现 #include <iostream.h> int gb ...
 - [Python3 练习] 006 汉诺塔2 非递归解法
		
题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...
 - [Python3 练习] 005 汉诺塔1 递归解法
		
题目:汉诺塔 I (1) 描述 传说,在世界中心贝拿勒斯(在印度北部)的圣庙外有左中右三根足够长的柱子(塔) 左边柱子上套着 64 片金片,金片按"上小下大"排,其余两根是空柱子 ...
 - python3汉诺塔简单实现代码
		
小时候喜欢玩汉诺塔,今天用python实现简单的汉诺塔功能 代码: def hannoi(n,x,y,z): if n==1: print(x,'-->',z) else: hannoi(n-1 ...
 - Go基础之函数递归实现汉诺塔
		
Go递归实现汉诺塔 package main import "fmt" // a 是源,b 借助, c 目的长度 func tower(a, b, c string, layer ...
 - Python使用函数模拟“汉诺塔”过程
		
运行效果: 源代码: 1 # -*- coding:utf-8 -*- 2 ##汉诺塔游戏开始 3 _times=0 #用于统计移动次数 4 def hannuota(nlist,mfrom,mpas ...
 - "递归"实现"约瑟夫环","汉诺塔"
		
一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...
 - python下实现汉诺塔
		
汉诺塔是印度一个古老传说的益智玩具.汉诺塔的移动也可以看做是递归函数. 我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为: 如果a只有一个圆盘,可以直接移动到c: 如果a有N个圆盘,可以 ...
 - 从"汉诺塔"经典递归到JS递归函数
		
前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来 ...
 
随机推荐
- UML中类图的一些基本知识
			
一.类 类(class)封装了数据和行为,是面向对象的重要组成部分,他是具有相同操作.属性.关系的对象集合的总称. 在软件运行时,类被实例化成对象(object),对象对应某个具体的事物,是类的实例( ...
 - js 的数学处理方法
			
1.javascript取整方法floor.round.ceil floor向下取整: Math.floor(0.20); Math.floor(0.90); Math.floor(-0.90); / ...
 - I2S协议
			
(一)I2S总线概述: 音响数据的采集.处理和传输是多媒体技术的重要组成部分.众多的数字音频系统已经进入消费市场,例如数字音频录音带.数字声音处理器.对于设备和生产厂家来说,标准化的信息传输结构可以提 ...
 - 运算符、单双分支&多分支、while循环
			
一 .运算符: 1. 算术运算符: " + "." - " ." * " ." / " 分别为加.减.乘.除. % 是& ...
 - JAVA实用案例之文件导出(JasperReport踩坑实录)
			
写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...
 - cain使用方法
			
首先安装cain,这里就不废话了 1, 选择中核弹标志左边的按一下,然后在sniffer右键点击第一个扫描内网所有ip 扫描完后选择网关的IP下面选择arp标志,在按一下上方空格处,+号变得可以使用了 ...
 - js面向对象学习笔记(三):原型
			
//原型:改写对象下面公用的方法或者属性,让公用的方法或者属性在内存中只存在一份(提高性能)//原型:prototype :要写在构造函数的下面var arr =[1,2,3,4,5];var arr ...
 - Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)
			
A. Carrot Cakes time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
 - android 2048游戏、kotlin应用、跑马灯、动画源码
			
Android精选源码 2048游戏源码 android实现获取号码归属地和其他信息诈骗.骚扰 android kotlin仿开眼app源码 android多种reveal动画效果 android K ...
 - 解决JSONObject.fromObject数字为null时被转换为0
			
在使用JSONObject.fromObject的时候会遇到一种情况就是当对象的某一个Double型或Integer型的属性为空的时候,转JSON的时候会变成0.当一个布尔型的属性为空的时候,转JSO ...