预备知识: 1.写过递归函数
2.懂得基本的语法
3.懂得基本的复杂度分析
递归的三大要素
第一要素:明确你这个函数想要干什么
第二要素:寻找递归结束条件
第三要素:找出函数的等价关系式
第三要素可能比较难♂,可以看看离散数学,再多做做习题,会有些体会的
def factorial(n):
if number == 0:
return 1
else:
return n * factorial(n - 1)
这段代码执行,如下图所示
但是递归很容易形成资源的浪费,中间有些资源会放入栈中(以前的系列文章也有介绍,)如:
这个斐波拉契数列的递归树
所以这个时候,我们得制造一些筛选条件,过滤不需要的值。
def factorial(number):
"""加入临时变量,减少了递归次数,妙啊"""
if number == 0:
return 1
else:
recurse = factorial(number-1)
# print(recurse)
result = number * recurse
return result
从这个复杂度的变化,也可以看出计算机资源的浪费,前面的复杂度的分析有一些介绍。
所以,怎样添加制约条件,优化代码,这个问题值得深思。
《像计算机科学家一样学Python》---递归
《数据结构与算法Javascript描述》--- 高级算法
《离散数学》---普通齐次差分方程