如何在Python中计算序列中所有数字的乘积

4

如果我告诉程序n=10,我该如何让它返回10*9*8*7*6*5....1

我想到了使用while循环,但我感觉哪里出错了,因为它没有把序列中的所有数字相加。

我的当前代码如下:

def product(n):
  i=n
  a=n-1
  while a>0:
    return i * a
    b=i * a
    a=a-1
    i=i-1

在不使用递归的情况下,有没有更好的方法来实现它?对于这个入门级问题感到抱歉,但我正在努力自学编程。毕竟,所有人都要从零开始!

谢谢!


求和还是相乘?顺便提醒一下,你的循环中第一件事情就是返回。 - obataku
当你使用return时,你不会让循环中的任何其他代码运行,并且只会循环一次。 - obataku
1
你可以使用 reduce 如果你喜欢,但如果目标是学习,那可能不是很好。reduce(range(1, n+1), lambda a, b: a*b) 或者 math.factorial - Platinum Azure
@BillyThompson 当你按下 return 键时,你会退出当前函数,所以如果你想让你的循环运行多次,那么 return 必须在循环外部。你需要在循环结束后,在所有工作都完成之后使用它来返回一个值。 - Levon
@PlatinumAzure - 学习reduce没有错,虽然你的参数顺序颠倒了,函数应该放在第一位,序列放在第二位。这使得将reduce和lambda结合成一个只接受序列的函数变得容易,可以使用functools.partial,例如product_of = partial(reduce, lambda a,b: a*b),这样就可以轻松地编写print product_of(range(1,10+1)) - PaulMcG
显示剩余3条评论
9个回答

7
由于你正在学习编码,我不会给你一个完整的解决方案,但我会给你一些提示:
  • 使用for循环(使用range(1, n+1))而不是while循环。这将生成您想要相乘的值并迭代正确次数的值(有时使用while循环可能会有些棘手)。

  • 创建一个名为product的变量来存储每次循环中的乘积结果。

  • 在进入for循环之前初始化product。一旦进入循环,您只需更新product的值即可。

  • 完成循环后,您可以使用return语句返回product的值。

  • 最后,出于测试目的,您可能希望从小的n值开始,例如4,并打印出您在循环中计算的值,以验证代码的工作方式。

还有更简洁和Pythonic的方法来做到这一点,但这使用了您已经设置的代码结构。当然,您也可以像您提到的那样递归地实现。
一旦掌握了基础知识,您将会欣赏更通俗易懂的编写方式或调用适当的函数来完成这项任务。

@BillyThompson 好的..如果你有任何问题或进展,请告诉我,我认为这比看如何调用函数或获取已经编写好的解决方案更有长远意义。 - Levon
1
好的,我会做 :) 我想在调用函数之前能够理解背后的方法。 - Billy Thompson

4

好的,这是另一种Pythonic方法。

>>> import operator
>>> numbers = range(1, 11)
>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> reduce(operator.mul, numbers)
3628800

3
好的,我会尽力为您翻译。以下是需要翻译的内容:是的,但这如何帮助 OP 学习编程?OP 表示“我正在尝试自学编码”。这展示了如何调用函数... 答案:是的,但这怎样帮助 OP 学习编程呢?OP说“我正在尝试自学编码”。这个例子展示了如何调用函数... - Levon
1
这直接回答了标题中提出的问题。"如何将序列中的所有数字相乘" - FogleBird
7
Stack Overflow 不仅仅是为了帮助提问者,还为那些通过谷歌等搜索引擎来到这里的人提供帮助。 - FogleBird
我同意你的观点,Stack Overflow并不仅仅是为了提问者,但是这个问题是。根据提问者的帖子,我怀疑看到reduce()等函数并不能帮助到提问者。我想每个人都会用自己的方式来帮助别人。 - Levon
我认为这是解决问题的最佳方案。 - Tom

3
假设你想要计算阶乘函数,你可以简单地使用 math.factorial()
>>> import math
>>> math.factorial(10)
3628800

谢谢,但我正在尝试理解其阶乘方面的逻辑。虽然这也会很有用。 - Billy Thompson
3
我认为这不会帮助 OP 学习编程,而是教他如何调用函数。 - Levon
@Levon 对不起,我不同意。我认为“如何调用正确的函数”而不是从头开始实现所有内容,也是学习编程的重要部分。学习如何做出这种判断甚至更加重要。此外,OP明确询问是否有一种“无需递归”的更简单的方法来完成它,而确实有这样的方法。基于这些原因,我不明白为什么我的答案应该被downvote。 - K Z
我在这里没有对任何一个答案进行过投票..仅仅因为我发表评论并不意味着..所以请不要轻易下结论。也许其他人认为你的方法不够有帮助?至少还有另外一个人这样认为。而你并没有帮助OP学习如何编程,而是使用其他程序员的产品。 - Levon
@Levon 对于我暗示你进行了负面评价,我感到很抱歉。我并不想在这里与你争论,但是你不认为学习如何使用其他程序员的产品也是“学习编程”的一部分吗?即使Python本身也是其他程序员的“产品”。除非你只是在谈论学习算法。 - K Z
显示剩余3条评论

2
您正在尝试查找一个数字n的阶乘。对于查找一个数字的阶乘,有两种方法:
  1. 使用循环结构
  2. 使用递归(如您所提到的)
作为一名新手程序员,您最好使用一个简单的循环结构,从1到n运行,并将每次迭代的相乘值放入一个变量中。 那个变量就是你的答案。但是请注意,递归也可以工作,并使代码看起来更加优雅。祝编程愉快!

1
这被称为阶乘10!相当于10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
def factorial(n):
    product = 1
    while n > 0:
        product *= n
        n -= 1
    return product

顺便提一下,在实践中,只需使用{{link1:math.factorial}}。


哇,非常感谢。但是,我有一点难以理解它。 *= n 是什么意思?我假设它允许将n乘以n-1?但是,我很难理解它,因为为什么n每次循环都会将自己存储为n *(n-1)。抱歉,很难用言语表达我为什么感到困惑。 - Billy Thompson
@BillyThompson product *= n 的意思是 product = product * n;它会将到目前为止的乘积与每个 n 相乘,直到达到 0n -= 1n = n - 1 是一样的,每次循环都会减去 1 - obataku
基本上,从 n 倒数计数到 0,将它们的累积乘积结果存储在 product 中。 - obataku
谢谢,那对我来说有所帮助。我只是还没有接触过那种语法。我现在会尝试全面理解并应用它。 - Billy Thompson
复合赋值运算符只是一种简写方式...不要感到有压力 :-) - obataku

1
 def factorial(n):
     if n <= 1: return 1
     return n * factorial(n-1)

我一直认为阶乘是学习递归的典型例子...


4
好的,但我只是想先掌握迭代的方法,然后再尝试递归。谢谢你的回答。 - Billy Thompson
4
尝试使用这种方法计算factorial(1000)。 :^) - DSM
是的,我知道那样做行不通 :P ... 我通常在 C 语言中完成这个练习,虽然它仍然存在问题,但比 Python 更少。 - Joran Beasley
1
你的代码会将 factorial(-10) == 1 返回为 True,而负数的阶乘是未定义的。虽然这只是一个小问题,但仍需注意。 - Akavall
1
阶乘使用迭代而非递归实现,这样做非常清晰明了。我认为这是将问题扭曲成特定编程主题的典型例子。 - PaulMcG
显示剩余2条评论

0
作为一个学习者,你应该不使用任何内置函数来完成它,这将帮助你更好地学习编程,而不仅仅是学习工具,因为一旦你成为一个优秀的程序员,学习工具就变得容易了。有两种方法可以做到这一点,我已经实现了更简单的版本。
使用递归:
def product(n):
    if n== 1:
        return 1
    return n * product(n-1)

使用简单循环:

def product(n):
    res = 1
    while n>1:
        res = res * n
        n = n - 1
    return res

0

另一种方法是使用scipy.product

>>> import scipy
>>> scipy.product(xrange(1,11))
3628800

0

对于太大无法直接计算的阶乘,可以使用斯特林公式进行计算。

n! := sqrt(2πn)*(n/e)^n,其中 e = 2.71828。


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