习题132、递归求两个数的最大公约数
方法1:
算法:
找出两个数的较小数(第一次)
如果两个数除以较小数余数都等于0的话,添加到一个列表中
不然的话继续调用函数自身,并且num-1传入到num参数中。
def max_common_divisor(a,b,num=0,result=[]):
if num == 0:
if a < b:
num = a
else:
num = b
if a%num == 0 and b%num == 0:
print(result)
result.append(num)
else:
max_common_divisor(a,b,num-1)
return result
print(max_common_divisor(24,120))
方式2:更相减损法
def get(small,big):
if small > big:
small,big = big,small
if small == big:
return small
return get(small,big-small)
print(get(30,24))
方式3:辗转相除法
def gain(small,big):
if small >big:
small,big = big ,small
if small == 0:
return big
return gain(small,big % small)
print(gain(24,30))
习题133、非递归实现求第n项斐波那契数列值
算法:遍历n,如果n等于0或1直接返回1
如果n >=2,记录前面两个项的和,并重新记录新的第1个,第2个数;
#coding=utf-8
def fib(n):
a,b=1,1
sum=0
if n<=0 or not isinstance(n,int):
return -1
for i in range(n):
if i <2:
sum =1
else:
sum=a+b
a=b
b=sum
return sum
print(fib(1))
print(fi