【教女朋友学算法】1个例子, 2分钟理解递归

什么是递归

维基百科: 在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。

举个例子:

排队买奶茶,想知道自己排在第几个,不想走到前面去数。于是问排在前面的桂香,她排在第几个。桂香也不想去数,于是他也问前面的淑芬同样的问题。直到问道队首的人。队首的翠兰人会说我排在第一个,然后消息会一个人一个人再传回到你这里,这样就直到排在第几个了。

 

问题可以等价为表达式:               

 为了防止无限套娃,队列中最终要有一个人知道自己是排在第几个。递归函数中需要有个条件判断,然后返回固定的值。

递归函数2个要素:

  1. 找出函数等价关系式
  2. 找出递归基(结束条件)

举例1:求数据n的阶乘

① 等价关系式:  f(n) = n * f(n-1)

② 递归基: f(1) = 1

函数为:

def factorial(n):
    if n == 1:   # 递归基
        return 1 
    else:
        return n * factorial(n-1)

举例2:经典的问题 Fibonacci数列

① 数列等价关系式   f(n) = f(n-1)+ f(n-2)

② 找出递归基,  f(2) = f(1) + f(0) ,    所以 f(1) 和 f(0)不能再调用函数,f(1)=1 f(0)=1

所以函数为:

def fibonacci(n):
    if n in (0, 1):  # 递归基
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

举例3:快速排序

快速排序的本质, 从需要排序的数里面随便找出一个,然后,把比这个数小的放在这个数左边,比这个数大的放在这个数右边。

原始数组:

第一次处理后,将小于6的都放到坐边,大于6的都放到右边

然后递归对坐边和右边的子数组进行分组,直到切割成最小单元为1个元素。则整个数据的完成排序。

因为只是进行换位处理,不反回数据,所以。

① 数列等价关系式   f(array,left, right) = 移动第一个元素到位置r,  quick(array, left, r-1), quick(array, r+1, rght)

② 找出递归基, 子数组长度==1或者0,则不处理

所以函数为:

def quick_sort(array, left, right):
    # 递归基
    if left>=right:  
        return None

    key=array[left]
    l,r =left,right
    while l<r:
        while l < r and array[r] > key:
            r -= 1
        array[l]=array[r]
        while l < r and array[l] <= key:
            l +=1
        array[r]=array[l]
    array[r]=key

    quick_sort(array, left, r-1)
    quick_sort(array, r+1, right)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值