【问题标题】:Using Reduce Function in Python To Find Factorial在 Python 中使用 Reduce 函数查找阶乘
【发布时间】: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。它对我不起作用。

标签: python map reduce factorial


【解决方案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 Bistapreceding 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 和未来的读者都将更有用。另外,如果不是其他九个答案,请至少解释您的方法与公认答案的区别。你在使用新语法吗?你的方法是否解决了以前的答案被忽视的问题?
          猜你喜欢
          • 1970-01-01
          • 2019-05-30
          • 2017-05-09
          • 2011-07-05
          • 2021-12-06
          • 1970-01-01
          • 1970-01-01
          • 2015-04-16
          • 1970-01-01
          相关资源
          最近更新 更多