前言
最近在python技能树重温以前学过的Python知识,把自己从知道点的大白又打回了小白了。知识果然知道的越多越觉得自己的不足。这个球的半径越大,空白也就越多。居安思危,日进尺步。分享几个我最近的学到的求阶乘、斐波那契的别样实现方法分享给大家。
一、求阶乘
0,1,2,3,4,5,6,7,8,9,10! 令人惊讶的是,6个星期的秒数居然也等于10!
不使用函数递归,实现一个阶乘计算函数(n<=170):
1、第一种方法
代码:
# -*- coding: UTF-8 -*- def fact(n): r = 1 import math r = math.factorial(n) return r if __name__ == '__main__': while True: n=int(input("请输入要求的阶乘数:")) print("您所求阶乘数为:"+str(fact(n)))
效果:
解析:利用python中math的自带函数 factorial,我们查看函数源码可以发现,该函数正式用于求阶乘的。
2、第二种方法
代码:
def fact(n): r = 1 for i in range(0, n): r *= (i + 1) return r if __name__ == '__main__': while True: n=int(input("请输入要求的阶乘数:")) print("您所求阶乘数为:"+str(fact(n)))
效果:
解析:
利用for循环来计算对应阶乘即 s=1*2*....*n-1*n妥妥的数学最初对阶乘的解释。
3、第三种方法
代码:
# # -*- coding: UTF-8 -*- # def fact(n): # r = 1 # import math # r = math.factorial(n) # return r # # if __name__ == '__main__': # while True: # n=int(input("请输入要求的阶乘数:")) # print("您所求阶乘数为:"+str(fact(n))) # # -*- coding: UTF-8 -*- def fact(n): r = 1 # for i in range(0, n): # r *= (i + 1) while n > 0: r *= n n -= 1 return r if __name__ == '__main__': while True: n=int(input("请输入要求的阶乘数:")) print("您所求阶乘数为:"+str(fact(n)))
效果:
解析:此方法与方法二异曲同工之妙,只是s=n*n-1*...*2*1,哈哈哈,甚是有趣。
4、第四种方法
代码:
def inner_fact(n, m): if m == n: return n return m*inner_fact(n, m+1) def fact(n): return inner_fact(n,1) if __name__ == '__main__': while True: n=int(input("请输入要求的阶乘数:")) print("您所求阶乘数为:"+str(fact(n)))
效果:
解析:
此方法使用函数调用子函数来循环计算,思路与上面两种一致,但看起来稍显复杂。
5、第五种方法
代码:
def inner_fact(n, r): if n == 1: return r return inner_fact(n-1, r*n) def fact(n): return inner_fact(n, 1) if __name__ == '__main__': while True: n=int(input("请输入要求的阶乘数:")) print("您所求阶乘数为:"+str(fact(n)))
效果: