Fork me on GitHub

逆水行舟,不进则退

人与人之间最小的差距是智商,最大的差距是坚持。

python学习日记(初识递归与算法)

递归函数

定义

递归的定义——在一个函数里再调用这个函数本身

递归的最大深度——997,即栈溢出。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
递归栈的溢出
def func(n):
    print(n)
    n += 1
    func(n)
func(1)

import sys
print(sys.setrecursionlimit(100000))
修改递归最大深度

例1

比如你问张三,张三你多大了?张三说他不告诉你,但张三比李四大两岁。

你想知道张三多大,你是不是还得去问李四?李四说,我也不告诉你,但我比王五大两岁。

你又问王五,王五r也不告诉你,他说他比赵六大两岁。

那你问赵六,赵六告诉你,他10岁了。

这个时候你是不是就知道了?张三多大

赵六:10

王五:12

李四:14

张三:16

age(4) = age(3) + 2 
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 40  

如果用函数的话,怎么写呢?

def age(n):
    if n == 1:
        return 10
    else:
        return age(n-1)+2
print(age(4))

这就实现了递归。

例二

使用递归函数实现阶乘。

def func(n):
    if n == 1:
        return 1
    else:
        return n * func(n-1)
print(func(5))

二分查找算法

务必详细看,理解每一行,谨记!

解决的问题有:返回值、end参数,索引

def fi(list,aim,start = 0,end = None):
    end = len(list)-1 if end is None else end
    mid = (end - start)//2 + start
    if start <= end:
        if list[mid] < aim:
            return fi(list,aim,start = mid+1,end = end)
        elif list[mid] > aim:
            return fi(list,aim,start = start,end = mid-1)
        else:
            return 'found you,aim索引:{},aim:{}'.format(mid,list[mid])
    else:
        return aim,'不在列表中'

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(fi(l,3))
def search(li,a):
    start = 0
    end = len(li)-1
    found = False
    while start<=end and not found:
        mid = (end - start) // 2
        if li[mid] == a:
            found = True
        else:
            if li[mid]>a:
                end = mid-1
            else:
                start = mid+1
    return found
l1 = [1,2,3,4,5,6,7,8,9,10,11]
print(search(l1,0))
判断是否在列表,是则True,否则False

pass

posted @ 2018-12-29 12:35  咕噜牛Gruffalo  阅读(175)  评论(0编辑  收藏  举报