6.1--课堂代码练习(嵌套-->记住列表第二种方法A、B--还要深嵌套、C)

#斐波那契数列递归,思路简单直接
#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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值