day18:正则表达式

1,复习递归:返回值,不要只看到return就认为已经返回了,要看返回操作是在递归的第几层发生的,然后返回给了谁,如果不是返回给最外层函数,调用者就接收不到,需要再分析,看如何把结果返回回来,超过最大递归限制的报错,只要写递归,必须要有结束条件

2,几乎所有的递归问题都可以用循环来解决问题,只不过有时候,循环考虑的事情更多更复杂,递归会相对少一些,循环写好了,效率有时候会比递归好一点,有时候需要想太多问题,所以就用递归,比如快排,递归和算法联系很紧密,会把问题变简单,效率高。平时递归用的不多,除非,算法分析什么的,如果未来不做这些,工作的很长一段时间都是用不到的。面试有时候会考,递归是非常经典的计算机算法和思想,能看懂,能掌握几个经典的数学算法和概念就可以了

3,作业题一,斐波那契数列递归实现,一定要注意结束条件和传递

# 1,1,2,3,5,8,13,21,34,55
# 第一种,树性结构
def fib(n):
    if n == 1 or n ==2:
        return 1   # 结束条件
    else:
        return fib(n-1) +fib(n-2)
print(fib(10))


# 循环实现
def fib(n):
    num1, num2 = 1,1
    num = 0
    if n==1 or n==2:
        return 1
    else:
        for i in range(n-2):
            num = num1 + num2
            num1 = num2
            num2 = num
        return num
print(fib(8))

# 第三种
# 一次调用,那就返回两个值
def fib(n,l=[0]): # 默认参数的陷阱问题,无论发生多少次调用,这个地方都只是用这一个值,利用了这个陷阱问题,在不同的函数调用之间传递值
    l[0] +=1
    print(l[0])
    if n == 1:
        return 1
    if n ==2 :
        l[0]-=1
        return 1,1
    else:
        a,b = fib(n-1)
        l[0]-=1
        print(l[0])  #  这只是个计数器,计算调用了多少次,最后减完了就可以返回结果了
        # a,b = b,a+b
        if l[0] == 0:
            return a+b
        return b,a+b

print(fib(11))

4,发生一次调用和两次调用的会非常慢,因为是树形调用,2的n次方和n次的区别

5,作业题二,阶乘

# 作业题二:阶乘factorial  1 1*2

# 循环实现
def fac(n):
    if n == 1:
        return 1
    else:
        b = 1
        for i in range(1,n+1):
            b = i * b
        return b
print(fac(4))


# 递归实现
def fac(n):
    if n == 1:
        return 1
    else:
        return n*fac(n-1)

print(fac(3))

6,

猜你喜欢

转载自www.cnblogs.com/lisa-blog/p/10126036.html