【问题标题】:Problem with Python code for finding factorials用于查找阶乘的 Python 代码问题
【发布时间】:2019-10-28 13:55:34
【问题描述】:

让函数FirstFactorial(num) 接受传递的num 参数并返回它的阶乘。例如:如果 num = 4,那么您的程序应该返回 (4 * 3 * 2 * 1) = 24。对于测试用例,范围将在 1 到 18 之间,并且输入始终是整数。

这是我的代码

def FirstFactorial(num):
    x = [1]
    if num == 1:
        return 1
    else:
        for i in range(1,num+1):
            x = x*(i)
    return x

print (FirstFactorial(4))

预期的输出是24。我从上面给出的代码中得到以下输出。

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

【问题讨论】:

  • 为什么是x = [1] 而不是x = 1?阶乘不是列表。
  • 你的代码的输出是什么?
  • @moreON 应该是一个很长的 1 列表
  • @JohnColeman - 当然会,但鼓励人们在他们的问题中包含实际输出肯定很好?
  • @moreON 好点

标签: python python-3.x


【解决方案1】:

让我们编写更好的代码:

def factorial(num):
    f = 1
    for i in range(1, num+1):
        f = f * i
    return f

您的代码的某些部分根本没有意义,例如,x = [1] 声明 x 等于一个包含一个元素的列表。然后,如果您在 python 中创建list * number,则将列表相乘:

x = [1, 2]
x = x * 2
print(x) # prints [1, 2, 1, 2]

使用上面的代码不需要检查数字是否为 1 的 if 语句。

【讨论】:

  • @MarcoMaher 将答案标记为正确答案 :) 很高兴知道我提供了帮助
【解决方案2】:

你可以这样做:

import math
print(math.factorial(4))  

输出:

24

【讨论】:

    【解决方案3】:

    你犯了一个小错误。与其将变量 x 定义为列表(在函数 FirstFactorial(num)x=[1] 定义之后的第一行),不如将 x 定义为单个数字,即 x=1

    在 Python 中,将列表乘以正标量(例如 n)会导致列表中的数字重复 n 次数。换句话说,* 运算符将列表重复给定的次数。这就是您的代码中x = x*(i) 行中发生的情况。

    您可以阅读有关 python 列表的更多信息here

    以下代码可以正常工作,并完成您的工作。我所做的唯一更改是在函数FirstFactorial(num) 定义之后的第一行。

    def FirstFactorial(num):
        x = 1
        if num == 1:
            return 1
        else:
            for i in range(1,num+1):
                x = x*(i)   
        return x
    
    print (FirstFactorial(4)) 
    >>24
    

    此外,您不需要单独的 if 语句来定义 1!。以下代码更简洁,它将为您提供包括 1 在内的所有数字的阶乘。

    def FirstFactorial(num):
        x = 1
        for i in range(1,num+1):
            x = x*(i)   
        return x
    
    print (FirstFactorial(1))
    >> 1
    

    【讨论】:

      【解决方案4】:

      您的 x 声明中有错误。另外,使用 lambda 表达式。

      fact = lambda n:1 if n==0 else n*fact(n-1)

      print(fact(4))

      >>> 24

      42 字节

      fact = lambda x:0**x or x*fact(x-1)

      print(fact(4))

      27 字节

      Python 在 math 模块中有 C 类型的阶乘方法内部实现。由于它是 C,它比 Python 的方法更快。

      import math
      
      print(math.factorial(4))
      

      第一个答案仍然有 for 循环,

      def factorial(n):
          return 1 if ( n == 1 or n == 0 ) else n * factorial(n - 1)
      

      【讨论】:

      • 有点巴洛克风格(尤其是对于像 OP 这样的初学者),另外:fact(1000) throws RecursionError: maximum recursion depth exceeded in comparison
      • 您可以增加堆栈深度以进行更深层次的递归调用,sys.setrecursionlimit()
      【解决方案5】:

      实际上对我来说是正确的,我得到了这个并达到了给定的测试结果。

      def FirstFactorial(num):
        if num ==1:
          return 1
        else:
          for i in range(1, num-1/2):
             num = num*(i)
        return num
      
      # keep this function call here 
      

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 2017-01-25
        相关资源
        最近更新 更多