在Python中使用Reduce函数来计算阶乘

5

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

因此,对于factorial(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,但我无法弄清楚。如何编辑我的现有代码以使其正常运行?


你必须使用递归吗? - Padraic Cunningham
不需要。实际上,我只需要使用range、multi和reduce。 - Whooperton Goldberg
什么是xrange? 它对我不起作用。 - Whooperton Goldberg
使用Python 3吗?如果是,只需使用range - Padraic Cunningham
没关系,我已经解决了。 - Whooperton Goldberg
显示剩余2条评论
11个回答

9
你可以很容易地完成这个操作:
>>> import functools, operator
>>> functools.reduce(operator.mul, xrange(1, 6))
120

请注意,第一个参数是一个函数(你正在传递一个函数调用的结果)。第二个参数是一个可迭代对象。此外,请注意,以这种方式编写,不需要递归... operator.mul 相当于你的 mult 函数

但是如果它不在6的范围内呢? - Whooperton Goldberg

5
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。

2
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))

output:- Input 3 Solution output 6


1
虽然这段代码片段可能解决了问题,但它并没有解释为什么或者如何回答这个问题。请在您的代码中包含解释,因为这真的有助于提高您的帖子质量。记住,您正在为未来的读者回答问题,而这些人可能不知道您提出代码建议的原因。您可以使用[编辑]按钮改进此答案以获得更多的投票和声望! - Brian Tompsett - 汤莱恩
除了格式之外,这个答案与Surya Bista一年前的先前的答案完全相同。 - dbc

2
 >>> x = 8
 >>> reduce(lambda x,y: x*y, [1, 1] if x == 0 else xrange(1, x+1))

尽管此代码片段可能解决问题,但它并没有解释为什么或者如何回答这个问题。请包括代码的解释,因为这真的有助于提高您的帖子质量。记住,您正在回答未来读者的问题,这些人可能不知道您提供代码建议的原因。您可以使用[编辑]按钮改进此答案以获得更多投票和声望! - Brian Tompsett - 汤莱恩

1
如果您使用的是2.7版本,则我建议您查看reduce文档(链接)。如果您使用的是3版本,则我们可以看到functools.reduce与2.7版本中的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)来解决此问题。
希望这能帮助您澄清事情!

0
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

1
你能否编辑你的回答并加入一些解释呢?这对于提问者和未来的读者都更有用。此外,请至少解释一下你的方法与被接受的答案有何不同,是否使用了新的语法?你的方法是否解决了之前答案中忽略的问题? - Jeremy Caney

0
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)) 

2
虽然这段代码片段可能解决了问题,但它并没有解释为什么或者如何回答这个问题。请在您的代码中包含解释,因为这真的有助于提高您的帖子质量。记住,您正在为未来的读者回答问题,而这些人可能不知道您提出代码建议的原因。您可以使用[编辑]按钮改进此答案以获得更多的投票和声望! - Brian Tompsett - 汤莱恩

0
from functools import reduce


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

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


虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的附加上下文可以提高其长期价值。 - Thavas Antonio

0

我的解决方案:

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))

0
这是一个使用reduce内置函数的完美阶乘函数片段。当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)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接