qitong 2019-11-04
当年,典型的递归题目,斐波那契数列还记得吗?
def fib(n): if n==1 or n==2: return 1 else: return fib(n-1)+fib(n-2)
当然, 为了程序健壮性,加上try...except...
def fib(n): if isinstance(n, int): print('兄弟,输入正整数哈') return try: if n==1 or n==2: return 1 elif n <= 0: print('兄弟别输入0或负数呀') else: return fib(n-1)+fib(n-2) except RecursionError: print('兄弟,超过了最大递归深度'
是的,无论时间还是空间复杂度,递归真的是不太好使哈!这是递归的写法:
def fib(n): if n==1 or n == 2: return 1 a, b = 1, 1 for i in range(2, n): a, b = b, a+b return b
我稍微解释三点:
range(2, n)
,因为,斐波那契数列从1
开始,所以fib(n)
就是数列的第n
项1
,所以要少两项,为range(2, n)
(要循环n-2
次)a, b = b, a+b
这里你也许也有困惑,我简单说说,一般Python解释器会将逗号分隔的变量直接看做一个元组,a, b = b, a+b
这句话的精髓在于,在等式右边将b
视为fib(n-2)
,将a+b
视为fib(n-1)
写一个函数,求杨辉三角形,第i行,第j列的值
fun(0, 0) = 1
fun(5, 2) = 10
同样,先写递归写法(我这里不考虑特殊情况了,时间有限):
def YH_tri(a, b): if a == b or b == 0: return 1 else: return YH_tri(a-1, b)+YH_tri(a-1, b-1)
老铁们自己先想想该怎么写??