【Python学习日记】B站小甲鱼:递归和汉诺塔问题

求阶乘 比如输入5,输出1*2*3*4*5的结果

使用循环体

def factorial(n):
    result = n
    for i in range(1,n):
        result *= i

    return result

temp = int(input('输入正整数:'))
print(factorial(temp))

使用递归:1.调用函数自身;2.设置正确的返回值(结束条件)

def factorial(n):
    if n == 1 :
        return 1
    else:
        return n*factorial(n-1)

temp = int(input('输入正整数:'))
print(factorial(temp))

递归使用栈存储方式,比较消耗时间和空间。所以在求阶乘这种程序上递归是不被建议的,因为如果用户输入太大的数字会导致程序崩溃。python3的递归深度默认是100层

 

斐波那契数列 :分治思想

以迭代的方式

def factorial(n):
    if n == 1 or n == 2 :
        return 1

    else:
        return factorial(n-1)+factorial(n-2)

temp = int(input('输入正整数:'))

print(factorial(temp))

以循环的方式

def fab(n):
    n1 = 1
    n2 = 1
    n3 = 1
    while (n-2)>0:
        n3 = n1 + n2
        n1 = n2
        n2 = n3
        n -= 1
    return n3

temp = int(input('请输入正整数:'))
print(fab(temp))

迭代会比较消耗时间和空间,在数字比较大的时候可以明显的感受到两个程序的消耗时间的差别

 

汉诺塔问题

def hanoi(n,x,y,z):
    if n == 1:
        return (x,'-->',z)
    else:
        hanoi(n-1,x,z,y) #将n-1个盘子从x移动到y上
        print(x,'-->',z) #x上的盘子移动到z上
        hanoi(n-1,y,x,z) #将y上的n-1个盘子移动到z上

n = int(input('输入汉诺塔的层数:'))
hanoi(n,'X','Y','Z')

 

posted @ 2020-08-23 23:13  JodyJoy  阅读(236)  评论(1编辑  收藏  举报