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)老铁们自己先想想该怎么写??