递归简化问题(更新中)

1.gcd 最大公约数问题

在这里插入图片描述
在这里插入图片描述
非递归

def gcd(a, b):
    r = a % b
    while r > 0:
        a = b
        b = r
        r = a % b
    return b

递归 gcd(a,b)=gcd(b,r)

def gcd(a, b):
    r = a % b
    if r == 0:
       return b
    return gcd(b, r)   

2.Fibonacci数列

在这里插入图片描述
用Binet公式做

mport math
value1 = math.pow(5, -1/2)
value2 = math.pow(5, 1/2)
def Fibonacci(n):
    return value1 *( (math.pow((1+value2)/2, n)) - (math.pow((1-value2)/2, n)))
n = eval(input())
print(int(Fibonacci(n)))

当然里面可以用sqrt函数
递归(基本类型)

def Fibonacci(n):
    if n == 0:
       return 0
    elif n == 1:
       return 1
    else:
       return  Fibonacci(n-1) +  Fibonacci(n-2)    

上述提供的参数越大,函数运行的时间就越长。

利用字典,方法叫备忘

known = {0:0, 1:1}
def Fibonacci(n):
    if n in known:
       return known[n]
    res = Fibonacci(n-1) + Fibonacci(n-2)
    known[n] = res
    return res   

3.十进制转换任意进制问题

在这里插入图片描述
简单看一下原理,除以该进制的数将余数倒序排出即可。
利用辗转相除法求解

def convert(n,x):
    list_a = [0,1,2,3,4,5,6,7,8,9,'A','b','C','D','E','F'] 
    list_b = []
    while True:
        s,y = divmod(n,x)  
        list_b.append(y) 
        if s == 0:
            break
        n = s
    list_b.reverse() 
    for i in list_b:
        print(list_a[i],end='')

商等于即代表求完divmod返回元组其中里面有商
最后输出用余数找到在列表中对应位数输出即可。
当然你可以改变一下函数让它不输出只返回

def convert(n,x):
    list_a = [0,1,2,3,4,5,6,7,8,9,'A','b','C','D','E','F']
    list_b = []
    l = []
    while True:
        s,y = divmod(n,x)
        list_b.append(y)
        if s == 0:
            break
        n = s
    list_b.reverse()
    for i in list_b:
        l.append(str(list_a[i]))
    return ''.join(l)

注意一点用join列表变字符串的时候一定要确保列表中的元素是字符串类型

递归类型的方法
def convert(n,x):
    if (n>=0) and (n<x):
        return n
    else:
        return convert(n // x,x) * 10 + n % x 

方法很巧妙,自己可以试试数。

4.汉诺塔问题

在这里插入图片描述
在这里插入图片描述
上述是该题的逻辑,即把n-1个通过c移动到b
再把第n个从a到c,再把n-1个从b通过a到c(a,b,c分别代表第一,第二,第三个柱子)

def hanoi(n, A, B, C):
    if n == 1:
       print('Move',n,'from',A,'to',C)
    else:
       hanoi(n-1, A, C, B)
       print('Move',n,'from',A,'to',C)
       hanoi(n-1, B, A, C)   

当然也可以简化一部分

def hanoi(n, A, B, C):
    if n == 0:
       return 
    else:
       hanoi(n-1, A, C, B)
       print('Move',n,'from',A,'to',C)
       hanoi(n-1, B, A, C)     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值