上图为去年某公司算法真题
1、写非递归
在这里插入代码片
# 法1:不常用还真没想起来这个方法
def func1(n):
from math import factorial
if n >= 0:
return factorial(n)
else:
print('出错')
# 法2:直接法
def func2(n):
if n in (0,1): return 1
elif n > 1:
in_num = n
while n > 1:
n -= 1
in_num *= n
return in_num
else: print('出错')
# 法3
def func3(n):
func = lambda a, b: a * b
from functools import reduce
if n > 1:
return reduce(func, range(1, n + 1))
if n == 1 or n == 0:
return 1
else:
print('出错')
#2、写递归
def func4(n):
if n == 0: return 1
elif n >= 1: return n * func4(n - 1)
else: print('出错')
3、此题里循环比递归快
因为递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的。具体是每次调用函数本身要保存的内容包括:局部变量、形参、调用函数地址、返回值。那么,如果递归调用N次,就要分配N局部变量、N形参、N调用函数地址、N返回值,这势必是影响效率的,同时,这也是内存溢出的原因,因为积累了大量的中间变量无法释放。