python基础知识(六)函数----(九)

(六)函数----(九)

目录

(六)函数----(九)

6.1递归

6.2例子

a.斐波那契 (1,1,2,3,5.....)

b.二分查找算法

c.三级菜单


6.1递归

递归:a.在函数中自己调用自己

           b.把大规模问题化解为小规模的同样问题

           c.必须有一个明确的递归结束条件,称为递归出口

递归的使用:如果递归次数太多,就不适合使用递归来解决问题

递归的缺点 : 占内存

递归的优点: 会让复杂的问题变的简单,简化代码

递归的最大深度求解:996

def foo(n):
    print(n)
    n += 1
    foo(n)
foo(1)

修改最大递归深度:

import sys
sys.setrecursionlimit(1000000)

6.2例子

a.斐波那契 (1,1,2,3,5.....)

def fib(n):
    if n == 1 or n==2:
        return 1
    return fib(n-1) + fib(n-2)
print(fib(50))

#优化代码
def fib(n,l = [0]):
    l[0] +=1
    if n ==1 or n == 2:
        l[0] -= 1
        return 1,1
    else:
        a,b = (n-1)
        l[0] -= 1
        if l[0] == 0:
            return a+b
        return b,a+b
print(fib(50))

b.二分查找算法

l = [1,2,3,4,5,6,7,8,9]

def find(l,aim,start = 0,end = None): #注意end的初值
    end = len(l) if end is None else end  #第一次调用函数,end = None
    mid = (end - start)//2 + start   #中间值 注意需要+strat 否则序号有问题
    if start <= end:
        if l[mid] < aim:
            return find(l,aim,start =mid+1,end=end) #需要return
        elif l[mid] > aim:
            return find(l, aim, start=start, end=mid-1)
        else:
            return mid  #需要return
    else:
        return '找不到这个值' #需要ruturn


ret= find(l,3)
print(ret)

c.三级菜单

number = {
    '小一': {
        '联系方式': {
            '微信': {
                '私人微信': {},
                '工作微信': {},
            },
            '电话': {
                '私人电话': {},
                '公司电话': {}, 
            },
        },
        '地址': {
            '房产1': {
                '北京': {},
            },
            '房产2': {},
        },
        '爱好': {},
        '职业': {},
    },
    '小二': {
        '联系方式': {
            "微信": {
                 '私人微信': {},
                 '工作微信': {},
            }
        },
        '地址': {
              '房产1': {
                '北京': {},
            },
        },
    },
    '小三': {},
}
def threeLM(dic):
     while True:
         for k in dic:print(k)
         key = input('input>>').strip()
         if key == 'b' or key == 'q':return key #b是返回上一层
         elif key in dic.keys() and dic[key]:
           ret = threeLM(dic[key])
           if ret == 'q': return 'q'

threeLM(menu)

l = [menu]
while l:
    for key in l[-1]:print(key)
    k = input('input>>').strip()  
    if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])
    elif k == 'b':l.pop()
    elif k == 'q':break

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值