2019年上海某大厂算法岗笔试真题第一题-python解决自然数的全阶乘

在这里插入图片描述
上图为去年某公司算法真题
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返回值,这势必是影响效率的,同时,这也是内存溢出的原因,因为积累了大量的中间变量无法释放。

猜你喜欢

转载自blog.csdn.net/Irwin2020/article/details/107209482