在 Python 中使用 Reduce 函数查找阶乘

Posted

技术标签:

【中文标题】在 Python 中使用 Reduce 函数查找阶乘【英文标题】:Using Reduce Function in Python To Find Factorial 【发布时间】:2014-11-26 22:46:40 【问题描述】:

您好,我正在尝试编写一个函数来查找任何给定数字的阶乘。例如,对于阶乘 (6),我会得到 6*5*3*2*1 的乘积。

所以对于阶乘(3),输出将是 6。

我目前拥有的功能是:

import functools 

def mult(x, y):
    return x * y


def factorial(n):
    if n == 0:
        return 1
    else:
        functools.reduce(mult(n,factorial(n - 1)))

但是我不断收到一个错误,即 Python 需要 2 个参数并且给出了 1 个。我知道我必须以某种方式使用range,但我无法弄清楚。如何编辑现有代码以使其正常运行?

【问题讨论】:

一定要用递归吗? 没有。其实我只需要使用range、multi和reduce。 所以你必须使用自己的函数multi? 好吧,只需将 mgilsons 中的 operator.mult 替换为您的 mult 答案,使用 xrange(1,n) 即可获得答案 什么是 xrange。它对我不起作用。 【参考方案1】:

你可以很容易地做到这一点:

>>> import functools, operator
>>> functools.reduce(operator.mul, xrange(1, 6))
120

注意第一个参数是一个函数(你传递的是函数调用的结果)。第二个参数是一个iterable。还要注意这样写,不需要递归……

operator.mul 等价于你的mult 函数

【讨论】:

但是如果它不在范围 6 内呢?【参考方案2】:

如果您使用的是2.7,那么我会推荐looking here at the documentation for reduce。如果您使用的是3,那么我们会看到 functools.reduce is the same as 2.7's reduce

也就是说,我们看到我们需要以与2.7 相同的方式调用functools。以下是对此的表示:

   reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

,翻译为:

   functools.reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])

对于您的示例,您正在制作自己的运算符,这令人困惑reduce这可以通过添加 import operator 来解决,然后使用operator 中定义的声明方法(即​​operator.add)。

我希望这有助于解决问题!

【讨论】:

【参考方案3】:
import functools

def factorial(n):
    if n == 0:
        return 1
    else:
        return functools.reduce(lambda x,y: x*y, range(1,n+1))

print factorial(3)

当然,如果您愿意,您可以使用自己的多功能函数来代替 lambda。

【讨论】:

【参考方案4】:
from functools import reduce

f=lambda x,y:x*y

def factorial(number):
    if(number==1):
        return 1
    else:
        return reduce(f,range(1,number+1))

print(factorial(n)) 

【讨论】:

虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。您可以使用edit 按钮改进此答案以获得更多选票和声誉!【参考方案5】:
 >>> x = 8
 >>> reduce(lambda x,y: x*y, [1, 1] if x == 0 else xrange(1, x+1))

【讨论】:

虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。您可以使用edit 按钮改进此答案以获得更多选票和声誉!【参考方案6】:
-----Import the reduce() function
from functools import reduce

---Read the input as an integer
n = int(input())

fact=reduce(lambda x,y:x+y,range(n+1))
print(fact)

【讨论】:

感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。【参考方案7】:
n = int(input())
import functools  
def factorial(n):
    if n == 0:
        return 1
    else:
        return functools.reduce(lambda x,y: x*y , range(1,n+1))

print(factorial(n))

输出:- 输入 3 解决方案输出 6

【讨论】:

虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。您可以使用edit 按钮改进此答案以获得更多选票和声誉! 除格式外,此答案与一年前的Surya Bista 的preceding answer 相同。【参考方案8】:

这是使用 reduce 内置函数的阶乘函数的完美 sn-p。这将在 n=0 时打印 1,因为 0 的阶乘是 1。

# Read the input as an integer
n = 4

# Import the reduce() function
from functools import reduce

fact = lambda x,y:x*y
print(1 if n == 0 else reduce(fact,range(1,n+1)))

【讨论】:

【参考方案9】:

我的解决方案:

from functools import reduce

list_num = list(range(1,8,1)) # instead of 8 put the number+1 of which you need factorial

def fact_num(acc, item):
  return acc*item

print(reduce(fact_num, list_num,1))

【讨论】:

【参考方案10】:
from functools import reduce


n = int(input("Enter a number: "))

print("Factorial is:", reduce(lambda x, y: x*y, range(1, n+1)))

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。【参考方案11】:
n = int (input ("Enter a natural number "))
n_list = range(1,n+1)
   
from functools import reduce   
factorial = reduce(lambda x,y: x*y, n_list) factorial

【讨论】:

您可以编辑您的答案以包含解释吗?这对 OP 和未来的读者都将更有用。另外,如果不是其他九个答案,请至少解释您的方法与公认答案的区别。你在使用新语法吗?你的方法是否解决了以前的答案被忽视的问题?

以上是关于在 Python 中使用 Reduce 函数查找阶乘的主要内容,如果未能解决你的问题,请参考以下文章

python 中 reduce 函数的使用

python中的reduce函数

python3中reduce()函数的使用方法示例

3.python函数编程-reduce函数

Python之reduce函数使用示例

我可以在reduce函数中有两个迭代吗? (Python)