递归:斐波那契数列与汉诺塔

递归(Recorsion)

递归算法里面最经典的两个非fibonacci和hanio莫属了

今天练习就这两数列用python代码实现

斐波那契数列

'''
Fibonacci(斐波那契数列)
1,1,2,3,5,8,13,25....
'''
#使用递归
#算法复杂度:O(2^n) 注:该递归算法复杂度较高,且运行速度较慢    
#定义实现函数
def fib(n):
    if n <= 1:
        return n
    else:  
        return(fib(n-1) + fib(n-2))

# 获取用户输入 
num = int(input("您要输出几项? "))

# 检查输入的数字是否正确
if num <= 0:
    print("输入正数")
else:
    print("斐波那契数列:")
    for i in range(num):
        print(fib(i))

#输出结果
#输出结果
您要输出几项? 10
斐波那契数列:
0
1
1
2
3
5
8
13
21
34
#使用简单的函数
#算法复杂度更低的fibonacci数列
#算法复杂为O(n)
def fib(n):
    num, a, b = 0, 0, 1
    while num < n:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'

#输出结果
>>> fib(6)
1
1
2
3
5
8
'done'

汉诺塔

#递归
#算法复杂度:O(2^n)
'''
设定三根棒子从左到右为:x、y、z
思路:
第一步:x上的(n-1)个盘子借助 z 到 y上
第二步:y上的(n-1)个盘子借助 x 到 z上
'''
def hanio(n,x,y,z):
    if n == 1:
        print(x,'-->',z)       #如果只有一层,直接从x移动到z
    else:
        hanio(n-1,x,z,y)    #将n-1个盘子从x移动到y
        print(x,'-->',z)       #最底下的盘子从x移动到z 
        hanio(n-1,y,x,z)    #将n-1个盘子从y移动到z

n = int(input('please input the floor:'))
hanio(n,'x','y','z')

#输出结果
please input the floor:3
x --> z
x --> y
z --> y
x --> z
y --> x
y --> z
x --> z

 

posted @ 2018-05-29 21:47  kumata  阅读(517)  评论(0编辑  收藏  举报