在Python中使用Reduce函数来查找因子

时间:2014-10-01 23:49:18

标签: python map reduce factorial

您好我正在尝试编写一个函数来查找任何给定数字的阶乘积。例如,对于阶乘(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,但我无法弄明白。如何编辑现有代码以使其正常运行?

10 个答案:

答案 0 :(得分:4)

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

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

请注意,第一个参数是函数(您正在传递函数调用的结果)。第二个参数是 iterable 。另请注意,以这种方式编写,不需要递归...

operator.mul相当于您的mult函数

答案 1 :(得分:1)

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

也就是说,我们发现我们需要以functools中的方式调用2.7。以下是对此的表示:

   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)来解决此问题。

我希望这有助于澄清事情!

答案 2 :(得分:1)

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。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

从functools导入reduce

f = lambda x,y:x * y

def阶乘(数字):     if(number == 1):         返回1     其他:         返回reduce(f,range(1,number + 1))

print(factor(n))

答案 5 :(得分:0)

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

答案 6 :(得分: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)))

答案 7 :(得分: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))

答案 8 :(得分:0)

from functools import reduce


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

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

答案 9 :(得分:-1)

-----导入reduce()函数 从functools import减少

---将输入读取为整数 n = int(input())

fact = reduce(lambda x,y:x + y,range(n + 1)) 打印(事实)