Hi there! 我是嘟嘟~受到前辈启发,想说可以纪录一下自己练习的过程,小女子为程式菜逼八,此系列非教学文,仅为个人解题笔记,可能有错误或未补充详尽之处,欢迎前辈们不吝指教!也欢迎正在自学的伙伴一起讨论学习~
Day 9: Recursion 3 (递迴)
输入格式
输入一个整数n
,作为函式factorial()
的参数
注意:如果您无法使用递迴或未能将递迴函数命名为阶乘或阶乘,则得分为。
If you fail to use recursion or fail to name your recursive function factorial or Factorial, you will get a score of 0 .
输出格式
建立一个函式factorial(n)
,并印出n的阶乘,代表从 1 开始连乘直到 n 为止,意即 n! = 1 x 2 x ... x n
样本输入
3
样本输出
6
题目原始格式
#!/bin/python3import mathimport osimport randomimport reimport sys# Complete the factorial function below.def factorial(n):if __name__ == '__main__': fptr = open(os.environ['OUTPUT_PATH'], 'w') n = int(input()) result = factorial(n) fptr.write(str(result) + '\n') fptr.close()
我的解答1
from functools import reduce #导入函数reducen = int(input()) def factorial(n): def prod(x,y): return x*y seq = [i for i in range(1,n+1)] #生成一个1~n的列表 return reduce(prod,seq) #对列表的前两个元素相乘后,再与后一个元素相乘,直到乘完所有元素print(factorial(n))
第一个想法是导入reduce()函数,但因为题目要求一个factorial()函式才会判断通过,就变成要在多包装一次,后来才发现是自己太菜逼八,还不懂递迴函数的概念,修改后,看起来更简洁直观了:
我的解答2
n = int(input())def factorial(n): return 1 if n == 1 else n*factorial(n-1)print(factorial(n))
输入 10
结果为 3628800
补充:
递迴基本概念 (Recursion)
将大问题拆分成一个个小问题,再各自将小问题解决以后得到答案,称为分治法(Divide and Conquer),递迴这个方法就是依据此概念形成的。
在数学以及电脑科学的领域当中,当一个函式会在执行当中,会不断地自己呼叫自己时,我们便认为这个函式具有递迴的性质。同时,为了避免函式永无止尽地自我呼叫 (self-calling),我们也需要设计一个明确的终止条件。因此,我们便得到了设计一个递迴函式的两个重点:
递迴自我呼叫的方式 以及结束呼叫的终止条件最常用到递迴的情况是?
阶乘 Factorial
费氏数列 Fibonacci sequence
最大公因数 GCD
REF【python入门教室 (15) 黑魔法,recursion,recursion depon (递迴函数的介绍)】
【Python 初学第八讲 — 递迴】