[自学Python纪录] HackerRank 新手30天挑战-Day09

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最大公因数 GCDREF
【python入门教室 (15) 黑魔法,recursion,recursion depon (递迴函数的介绍)】
【Python 初学第八讲 — 递迴】

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章