- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python基于递归算法实现的汉诺塔与Fibonacci数列示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了Python基于递归算法实现的汉诺塔与Fibonacci数列。分享给大家供大家参考,具体如下:
这里我们通过2个例子,学习python中递归的使用.
1. 找出Fibonacci数列中,下标为 n 的数(下标从0计数) 。
Fibonacci数列的形式是这样的:0,1,1,2,3,5,8,13…… 。
① 使用while循环,python2代码如下:
1
2
3
4
5
6
7
|
def
fib(n):
a,b
=
0
,
1
count
=
0
while
count<n:
a,b
=
b,a
+
b
count
=
count
+
1
print
a
|
运行结果如下:
>>> fib(0) 0 >>> fib(1) 1 >>> fib(2) 1 >>> fib(3) 2 >>> fib(4) 3 >>> fib(5) 5 。
② 使用递归(递归必须要有边界条件),python2代码如下:
1
2
3
4
5
|
def
fib(n):
if
n
=
=
0
or
n
=
=
1
:
#递归的边界条件
return
n
else
:
return
fib(n
-
1
)
+
fib(n
-
2
)
|
运行结果如下:
>>> fib(0) 0 >>> fib(1) 1 >>> fib(2) 1 >>> fib(3) 2 >>> fib(4) 3 >>> fib(5) 5 。
递归是最能表现计算思维的算法之一,我们以f(4)为例,看一下递归的执行过程:
同一程序,使用递归虽然程序简洁,但递归的执行效率要比循环低,系统的资源消耗比循环大。因为递归是一层一层地往里面调用,结束后又一层一层地返回,所以递归的执行效率并不高。那为什么还要使用递归呢?因为有一些问题,我们找不到非常明显的循环方案,但容易找到明显的递归方案。比如说著名的汉诺塔问题.
2. 汉诺塔 。
下图是一个简化版的汉诺塔游戏,只有4个盘子:
汉诺塔游戏规则如下:
python2代码如下:
1
2
3
4
5
6
7
|
def
hanoi(a,b,c,n):
if
n
=
=
1
:
#递归结束条件
print
a,
'->'
,c
else
:
hanoi(a,c,b,n
-
1
)
print
a,
'->'
,c
hanoi(b,a,c,n
-
1
)
|
运行结果:
>>> hanoi('A','B','C',1) A -> C >>> hanoi('A','B','C',2) A -> B A -> C B -> C >>> hanoi('A','B','C',3) A -> C A -> B C -> B A -> C B -> A B -> C A -> C 。
希望本文所述对大家Python程序设计有所帮助.
原文链接:https://blog.csdn.net/sxingming/article/details/51306784 。
最后此篇关于Python基于递归算法实现的汉诺塔与Fibonacci数列示例的文章就讲到这里了,如果你想了解更多关于Python基于递归算法实现的汉诺塔与Fibonacci数列示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试解决汉诺塔问题,到目前为止我已经尝试过: move(1,[H|T],B,C,A1,B1,C) :- A1 = T, B1 = [H|B]. move(N,A,B,C,A1,B1,C
我面临着编写一个函数(用 C 语言)的任务,该函数可以解决 Hanoi 塔问题并显示圆盘的每一个 Action 。 有问题的递归函数是:void hanoi(int m, int *I, int* J
我正在做一本书中的练习,要求我们使用递归方法解决汉诺塔问题。我找到了一个解决方案,但是从完成浏览 Internet 后收集到的信息来看,我的解决方案可能不正确。有谁知道解决问题的更好/不同方法?有没有
我为汉诺塔问题开发了一个解决方案: public static void bewege(int h, char quelle, char ablage, char ziel) { if(h >
我正在为学校做作业。这是汉诺塔任务。 (我还没有添加较大磁盘覆盖较小磁盘的代码)。当我将 tower3 设置为 4, 3, 2, 1 时,它说我赢了,但是当我在玩游戏时这样做时,什么也没有发生。请帮忙
我正在研究一个处理汉诺塔问题的变体的问题,在该问题中,您只能移动到相邻的钉子,而我们仅限于 3 个钉子问题。我已经获得了打印出光盘数量所需的移动的代码,但我不知道如何打印递归调用的数量。 def ad
所以我们遇到了经典的 Hanoi 问题,我刚刚开始研究这个递归问题,这真是太棒了!这是完全正常的,但我只是不明白它怎么可能!据我了解,对于任何 n,它都会打印“from +”到“+ thru”,每次
public class han { public static void main(String[] args) { hanoi(5, "A", "B", "C");
我有一个用java编写的汉诺塔程序,我能够让它工作,但我一生都无法弄清楚如何让它显示它的运行情况,例如“磁盘1从TowerA到TowerC”,“磁盘2从TowerA到TowerB”等。 这是我的代码:
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 7年前关闭。 Improve this
Label the pegs A, B, C let n be the total number of discs number the discs from 1 (smallest, topmost
我必须使用 Bellman 动态规划方程(如果问题当然是可以解决的)。 现在,我明白了等式背后的逻辑: 其中 V^T 是时间 T 的目标函数,a^0 是时间 0 的 Action ,x^0 是起始配置
虽然我在理解递归方面没有任何问题,但我似乎无法理解汉诺塔问题的递归解决方案。这是来自 Wikipedia 的代码: procedure Hanoi(n: integer; source, dest,
虽然我在理解递归方面没有任何问题,但我似乎无法理解汉诺塔问题的递归解决方案。这是来自 Wikipedia 的代码: procedure Hanoi(n: integer; source, dest,
我目前正在尝试制作一个c程序,首先要求用户输入磁盘的数量,然后允许用户自由移动磁盘。 不过,它必须有原汉诺塔的规则,比如较大的圆盘不能放在较小的圆盘上。 另外,极点是“0,1,2” 例如, 输入: 5
我想编写标准的汉诺塔算法,使用 3 个棒和 n 个圆盘。但我还想学习如何使用列表,所以我想我可以将其结合起来。 我考虑过创建 3 个元素,每个元素代表一根杆。每一个都有 discs[] 数组,例如,如
我在维基百科上看到了这个求解汉诺塔的递归算法。谁能给我解释一下我是如何得到这个算法的递归方程的? Recursive solution label the pegs A, B, C — these l
大家晚上好 我有一个关于我类正在做的关于递归的家庭作业的快速问题。我们的想法是我们有这个汉诺塔程序,我们需要编写一个 main 来制作一个显示数字 5-25 的表格,以及解决这个大小的塔需要多少步,例
这个问题在这里已经有了答案: How does recursive algorithm work for Towers of Hanoi? (2 个答案) 关闭 8 年前。 我已经在 SO 上看到了
我无法让它在 Dyalog APL 中工作 solve←{ n a c b←⍵ n≤0:⍬ solve(n-1)a b c ⎕←'Move disk from
我是一名优秀的程序员,十分优秀!