#斐波那契数列递归,思路简单直接
#1,1,2,3,5,8
import time
start = time.time()
def fibo(n,hu):
if n in hu:#这一步很容易忘记
return hu[n]
elif n in (1,2):
hu[n]=1
return 1
else:
# res=fibo(n-2,hu)+fibo(n-1,hu)#这里顺序改变,也会影响计算,这种顺序可以计算的最大值n=1996
res = fibo(n - 1, hu) + fibo(n - 2, hu)
huancun[n]=res#此顺序可以计算的最大值n=999
return res
if __name__ == '__main__':
huancun={}
print(fibo(999,huancun))
end = time.time()
print(end - start)
二、给定n个节点,求二叉树的个数(斐波那契数列递归数列的升级版本)
看下面两种方法的区别:
给边界条件n==0和n==1就够了。
#0个节点的二叉树方法:0
#一个节点的二叉树方法:1
#两个节点的二叉树方法:2
#三个节点的二叉树方法:5
#n个节点:左边有m个节点,右边有n-m-1个节点,中间为1个节点
def geshu(n):
if n==0 or n==1:
return 1
elif n==2:
return 2
elif n==3:
return 5
else:
res=0
for i in range(n):
res+=geshu(i)*geshu(n-i-1)
return res
if __name__ == '__main__':
print(geshu(8))
################################################第二种
#0个节点的二叉树方法:0
#一个节点的二叉树方法:1
#两个节点的二叉树方法:2
#三个节点的二叉树方法:5
#n个节点:左边有m个节点,右边有n-m-1个节点,中间为1个节点
def geshu(n):
if n==0 or n==1:
return 1
# elif n==2:
# return 2
# elif n==3:
# return 5
else:
res=0
for i in range(n):
res+=geshu(i)*geshu(n-i-1)
return res
if __name__ == '__main__':
print(geshu(8))
升级版本,使用buffer字典进行缓存:
#0个节点的二叉树方法:0
#一个节点的二叉树方法:1
#两个节点的二叉树方法:2
#三个节点的二叉树方法:5
#n个节点:左边有m个节点,右边有n-m-1个节点,中间为1个节点
def geshu(n,bu):
if n in bu:
return bu[n]
if n==0 or n==1:
bu[n]=1
return 1
# elif n==2:
# return 2
# elif n==3:
# return 5
else:
res=0
for i in range(n):
res+=geshu(i,bu)*geshu(n-i-1,bu)
bu[n]=res
return res
if __name__ == '__main__':
buffer={}
print(geshu(8,buffer))
二、列表嵌套展开(两种方法,第二种方法好一些,第二种俄罗斯套娃,A套完了,开始在A的基础上套B,B中还要往深了套)
def list_zhankai(dd,ll):
for i in range(len(dd)):
if type(dd[i]) in (int,float,str):
ll.append(dd[i])
else:
list_zhankai(dd[i],ll)
return ll
def list_zhankai2(dd):
ll=[]#俄罗斯套娃 ll=[12,2,3] A=12,2,3 B=[3,4,5,[3,4,[44,5]],[4,5]]
#ll_2=[A,B] 开始套娃B C=[9,4]
#ll_3=[A,B,C] 开始套娃C
for i in range(len(dd)):
if type(dd[i]) in (int,float,str):
ll.append(dd[i])
else:
tt=list_zhankai2(dd[i])
ll.extend(list_zhankai2(dd[i]))
return ll
if __name__ == '__main__':
ll=[]
dd=[12,2,3,[3,4,5,[3,4,[44,5]],[4,5]],[9,4]]
print(list_zhankai(dd, ll))
print(list_zhankai2(dd))