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)