最开始的思路,使用动态规划
但可以发现其数据了达到2**31所以不能这样做
# def fun1(n):
# if n&1: #奇数则不为0
# dp=[float("inf") for i in range(n+2)]
# dp[n]=0
# dp[n+1]=1
# else:
# dp=[float("inf") for i in range(n+1)]
# dp[n]=0
# for i in range(n-1,0,-1): #从n-1到1
# if i&1: #奇数
# if i*2>
# dp[i]=min(dp[i-1],dp[i+1],dp[i*2])
# else:
# fun1(8)
采用递归的方式
这里有一个巧妙的地方在于当当前数位奇数时
其-1或+1为偶数,可以直接进行整除2的操作,是的代码被大大化简
值得注意的是是在递归的过程中进行添加
def fun2(n):
def digui(i):
if i==1:
return 0
if i&1:#奇数
return 2+min(digui((i-1)//2),digui((i+1)//2))
else:
#偶数
return 1+digui(i//2)
return digui(n)
print(fun2(8))
在fun2的基础上采用记忆化的方式,使得重复计算可以不再重复算
from functools import lru_cache
def fun3(n):
@lru_cache(None, False) #可能会出现重复计算,所以采用记忆化递归
def digui(i):
if i==1:
return 0
if i&1:#奇数
return 2+min(digui((i-1)//2),digui((i+1)/2))
else:
#偶数
return 1+digui(i//2)
return digui(n)