递归函数和算法

1.递归函数:

1.简单的递归函数

def func():
    print(666)
    return func()
func()

2.递归的最大深度

执行一次,创建一个临时空间,且不关闭,无线的执行调用.
RecursionError: maximum recursion depth exceeded while calling a Python object
递归:执行次数是998/997 解释器会主动强制停止,报错.保护内存.
count=0
def func():
    global count
    count+=1
    print(count)
    func()
func()
View Code

3.更改最大深度

import sys
sys.setrecursionlimit(100000) 一般不提倡修改

4.递归函数:

优点:复杂的逻辑用递归非常简单.
缺点:递归次数多了,占用内存,费时间.

实例:

1.求age
def age(n):
    if n==4:
        return 18
    elif n>0 and n<4:
        return age(n+1)+2
print(age(1) )
2.#求阶乘:用递归函数和普通函数
def func(x):
    if x==1:return 1
    else:return func(x-1)*x
print(func(5))
def cal(x):
    sum=1
    for i in range(1,x+1):
        sum=sum*i
    return sum
print(cal(5))
View Code

2.算法,二分查找

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

在有序的列表中查找到66所在的位置

方法一: 循环 # 5000000 4999999

方法二: l.index(66) #最正确的方法

 

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l,aim,start,end):
    mid=(end - start) // 2 + start
    if l[mid] > aim:
        func(l,aim,start=start,end=mid)
    elif l[mid] < aim:
        func(l,aim,start=mid+1,end=end)
    elif l[mid] == aim:
        print(mid,aim,l[mid])
func(l,66,0,len(l)-1)
View Code

 

以上程序存在问题 1.查的值不存在
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l,aim,start,end):
    if start <= end:
        mid=(end - start) // 2 + start
        if l[mid] > aim:
            func(l,aim,start=start,end=mid)
        elif l[mid] < aim:
            func(l,aim,start=mid+1,end=end)
        elif l[mid] == aim:
            print(mid,aim,l[mid])
    else:print("你要找的值不存在")
func(l,66,0,len(l)-1)
View Code
2.参数的简化
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l,aim,start=0,end=None):
    if end==None:end=len(l)-1
    if start <= end:
        mid=(end - start) // 2 + start
        if l[mid] > aim:
            func(l,aim,start=start,end=mid)
        elif l[mid] < aim:
            func(l,aim,start=mid+1,end=end)
        elif l[mid] == aim:
            print(mid,aim,l[mid])
    else:print("你要找的值不存在")
func(l,66)
View Code
3.返回值的问题
def find(l,aim,start=0,end=None):
    if end == None:end = len(l)-1
    if start <= end:
        mid = (end - start) // 2  + start
        if l[mid] > aim:
            return find(l,aim,start=start,end=mid-1)
        elif l[mid] < aim:
            return find(l,aim,start=mid+1,end=end)
        elif l[mid] == aim:
            return mid  #返回给了上一级
    else:
        return None
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print('ret :',find(l,18))  #ret : 6
#不加return
def find(l,aim,start=0,end=None):
    if end == None:end = len(l)-1
    if start <= end:
        mid = (end - start) // 2  + start
        if l[mid] > aim:
            find(l,aim,start=start,end=mid-1)
        elif l[mid] < aim:
           find(l,aim,start=mid+1,end=end)
        elif l[mid] == aim:
            return mid  #返回给了上一级
    else:
        return None
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print('ret :',find(l,18))   #ret : None
View Code

 

 
 
 

 

 
 

转载于:https://www.cnblogs.com/zgf-666/p/8472741.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值