【问题标题】:How to find N facorial using a For loop? [duplicate]如何使用 For 循环找到 N 阶乘? [复制]
【发布时间】:2012-10-10 16:44:25
【问题描述】:

可能重复:
Function for Factorial in Python

我需要在 python 中编写一个返回 N! 的程序,而不使用阶乘函数。到目前为止,我已经编写了一个程序,但我一直收到错误消息,local variable "fact" is assigned but never usedfact = 1,分配后如何使用?

from pylab import *  


def factorial(n):
    fact = 1

for i in range(n):
    print("i = ", i)
    fact = fact * i

print("The factorial of " + str(n) + " is: " + str(fact))

【问题讨论】:

  • 您帖子中的缩进与文件中的缩进是否相同?尝试将整个 for 块缩进到函数定义之下。

标签: python


【解决方案1】:
In [37]: def fact(n):
    fac=1
    for i in range(2,n+1):
        fac *=i
    return fac
   ....: 


In [43]: fact(5)
Out[43]: 120

In [44]: fact(6)
Out[44]: 720

【讨论】:

  • 非常感谢!这个程序按照我需要的方式运行。你能解释一下 (2,n+1) 在“for”循环中的含义吗?
  • @Bill 假设 n 为 5,那么该范围将在每次迭代中一一返回值 2,3,4,5,我们在每次迭代中将它们与 fac 相乘。 range(2,6)=[2, 3, 4, 5]
【解决方案2】:

我对python知之甚少,但你应该在这些例子中使用递归。这很简单。递归是一个调用自身的函数

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

【讨论】:

  • 这样,你会很容易地用完 Python 中的堆栈。
  • 为什么? (每天学习)
  • 好吧,“很容易”是相对的,但请尝试使用 n = 1000 运行您的代码。函数的每次迭代都会再次调用该函数,为执行堆栈添加一个级别。如果你输入一个很大的数字,这个堆栈在它到达转义案例之前会变得非常高(if n==0 or n==1)。 Python 没有对此进行优化(称为尾递归),因此它具有有限的递归深度。
  • @jotape:每次调用函数时,都会分配一个堆栈帧来保存局部变量、指向调用堆栈帧的指针等。因此,不受控制的递归可能会耗尽所有可用内存。但这并不是在 Python 中发生的事情,因为它施加了人为的限制。不过,其他一些语言包括“尾调用优化”,它指出如果一个函数返回另一个函数调用的结果,则不再需要它的堆栈帧:另一个函数调用可以直接返回到祖父堆栈帧.
  • 它不适用于您的答案,因为您正在修改函数调用的结果:乘法要求堆栈帧始终保持不变。
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-02
相关资源
最近更新 更多