算法-数据结构入门(三)——《算法图解》

今天简单聊聊递归,递归还是比较难理解的,虽然它很好用。在《算法图解》的帮助下,我也是简单的理解了一下,下面把书上大佬的想法及我自己的收获整理一下。

先介绍一种新的数据结构:

是一种简单的数据结构,可以看成是一个桶,从顶部插入数据,也从顶部弹出数据,且只有这两种操作

递归,就是自己调用自己,可以理解为一个函数内部调用了自己本身,下面举一个简单的例子:

求10以内的阶乘,代码如下:

def fact(num):
    if num == 1:
        return num
    else:
        return num * fact(num-1)
        
print fact(5)

如上代码,else里面调用了函数自己本身。当然你也可以不用递归,用个for循环遍历也可以,像这样:

sum = 1
for x in range(1,6):
    sum = sum * x
    print sum

如果没有理解递归,可能会觉得for循环更简单一点(其实简单的我还是愿意用for循环),理解了之后,看递归的代码就会觉得简洁不少。下面说一下对递归的理解

递归必须有两部分:基线条件(常说的出口,停止调用自己,不然会无限循环),递归条件(自己调用自己)。上面求阶乘的函数里面的if是基线条件,else则是递归条件。

利用函数调用栈来理解递归(重要):

函数调用栈:程序在执行的时候,执行一个函数,就会把这个函数的涉及的数据放入一个内存块,并压入调用栈。当一个函数执行过程中调用另一个函数的时候,当前函数会暂停并处于未完成状态,这时调用的函数入栈,只有当调用的函数完成,弹出后,当前函数才会继续执行。这将帮我们更好的理解递归。

以fact(2)为例,简单画一个函数调用栈的图

算法-数据结构入门(三)——《算法图解》_第1张图片

最后附一个经典递归问题汉诺塔的代码:

def hanoi(a,b,c,n):
    if n == 1:
        print a ,'->' ,c
    else:
        hanoi(a,c,b,n-1)
        hanoi(a,b,c,1)
        hanoi(b,a,c,n-1)
hanoi('a','b','c',3)

汉诺塔解释可参考这位大佬的:https://blog.csdn.net/xb2355404/article/details/79144451

你可能感兴趣的:(算法-数据结构入门)