在 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 函数查找阶乘的主要内容,如果未能解决你的问题,请参考以下文章