문제

내 코드

import sys

number=int(sys.argv[1])

if number == 0
    fact=1
else
    fact=number
for (x=1; x<number; x++)
    fact*=x;             // mistake probably here

print fact

오류가 발생합니다

File "factorial.py", line 5
    if number == 0
                 ^
SyntaxError: invalid syntax

파이썬에서 어떻게 계승 기능을 할 수 있습니까?

도움이 되었습니까?

해결책

다음은 코드가 있습니다. 고정 및 작업은 다음과 같습니다.

import sys
number = int(sys.argv[1])
fact = 1
for x in range(1, number+1):
    fact *= x

print fact

(Factorial Zero는 하나입니다. 모르는 사람은 누구나 찾아야했습니다. 8-)

당신은 그 후 콜론이 필요합니다 if, else, for, 등, 그리고 길 for 파이썬에서의 작품은 C와 다릅니다.

다른 팁

오류가 켜져있는 줄을 읽어야합니다

if number == 0:

끝에 결장을 기록하십시오.

또한, 당신은 다른 대장과 다른 결장을 추가해야합니다. 콜론은 다른 언어로 {}와 유사하게 작동합니다.

마지막으로, 루프가 파이썬에서 작동하는 방법이 아닙니다. 해당 목록을 사용하려는 코드는

for x in range(1,number):

C 스타일 언어로 넣으면 쓴 것과 동일한 영향을 미칩니다.

편집 : 죄송합니다. 내가 준 루프가 잘못되었고 0이 포함되었을 것입니다.이를 수정하도록 코드를 업데이트했습니다.

나는 당신이 아마도 교육적 이유로 직접 구현하려고 노력하고 있음을 이해합니다.

그러나 그렇지 않은 경우 사용하는 것이 좋습니다 math 모듈 내장 FACTORION 기능 (참고 : Python 2.6 이상 필요) :

>>> import math
>>> math.factorial(5)
120

이 모듈은 C로 작성되었으므로 파이썬으로 작성하는 것보다 훨씬 빠릅니다. (큰 계승을 컴퓨팅하지 않으면 어느 쪽이든 너무 느리지 않을 것입니다).

Mark Rushakoff의 사실 (N) 기능이 훨씬 더 효율적이었던 이유는 그가 Reduce () 함수를 놓친 것이기 때문입니다. 따라서 실제로 계산을 한 적이 없습니다.

수정 (읽기) (그리고 나는 얻는다) :

import operator, timeit, math
#
def fact1(n):  return reduce(lambda x,y: x*y,  range(1,n+1),1)
def fact1x(n): return reduce(lambda x,y: x*y, xrange(1,n+1),1)
def fact2(n):  return reduce(operator.mul   ,  range(1,n+1),1)
def fact2x(n): return reduce(operator.mul   , xrange(1,n+1),1)
#
def factorialtimer():
    for myfunc in [ "fact1", "fact1x", "fact2", "fact2x" ]:
        mytimer = timeit.Timer(myfunc+"(1500)", "from __main__ import "+myfunc)
        print("{0:15} : {1:2.6f}".format(myfunc, mytimer.timeit(number=1000)))

    mytimer = timeit.Timer("factorial(1500)", "from math import factorial")
    print("{0:15} : {1:2.6f}".format("math.factorial", mytimer.timeit(number=1000)))

결과 출력 1500 !, 1000x :

fact1           : 3.537624
fact1x          : 4.448408
fact2           : 4.390820
fact2x          : 4.333070
math.factorial  : 4.091470

그리고 네, 나는 그들이 모두 같은 가치를 산출했는지 확인했습니다! Lambda Xrange가 Lambda 범위보다 훨씬 나빠진 이유를 이해할 수 없습니다. 흠. 버전 : Pythonwin 2.6.2 (R262 : 71605, 2009 년 4 월 14 일, 22:40:02) [MSC V.1500 32 비트 (Intel)] Win32.

흠 ... 다시 실행 중에 나는 더 믿을만한 것을 얻는다.

fact1           : 7.771696
fact1x          : 7.799568
fact2           : 7.056820
fact2x          : 7.247851
math.factorial  : 6.875827

및 Python 2.6.5 (R265 : 79063, 2010 년 6 월 12 일, 17:07:01) [GCC 4.3.4 20090804 (릴리스) 1] Cygwin :

fact1           : 6.547000
fact1x          : 6.411000
fact2           : 6.068000
fact2x          : 6.246000
math.factorial  : 6.276000

모두 소음에 모두 그렇지 않습니까?

다음은 기능적 요인이 있습니다.

>>> def fact(n): return reduce (lambda x,y: x*y, range(1,n+1))
... 
>>> fact(5)
120

사실 (0)에는 효과가 없지만 그 범위 외부에 대해 걱정할 수 있습니다. fact :)


Masi는 기능 스타일이 Richie의 구현보다 더 효율적인지 물었습니다. 나의 빠른 벤치 마크에 따르면 (놀랍게도!) 예, 내 것이 더 빠릅니다. 그러나 우리가 바꿀 수있는 몇 가지 일이 있습니다.

먼저, 우리는 대체 할 수 있습니다 lambda x,y: x*y ~와 함께 operator.mul 다른 의견에서 제안한 바와 같이. 파이썬 lambda 운영자는 중요하지 않은 오버 헤드와 함께 제공됩니다. 둘째, 우리는 대체 할 수 있습니다 xrange ~을 위한 range. xrange 선형 공간에서 작동하여 필요에 따라 숫자를 반환해야합니다. range 한 번에 전체 목록을 만듭니다. (그러면 거의 확실히 사용해야한다는 점에 유의하십시오. xrange 지나치게 넓은 숫자의 경우)

그래서 새로운 정의는 다음과 같습니다.

>>> import operator
>>> def fact2(n): return reduce(operator.mul, xrange(1,n+1))
... 
>>> fact2(5)
120

놀랍게도, 이것은 실제로 성능이 느려졌습니다. Q & D 벤치 마크는 다음과 같습니다.

>>> def fact(n): return (lambda x,y: x*y, range(1,n+1))
... 
>>> t1 = Timer("fact(500)", "from __main__ import fact")
>>> print t1.timeit(number = 500)
0.00656795501709

>>> def fact2(n): return reduce(operator.mul, xrange(1,n+1))
...
>>> t2 = Timer("fact2(500)", "from __main__ import fact2")
>>> print t2.timeit(number = 500)
0.35856294632

>>> def fact3(n): return reduce(operator.mul, range(1,n+1))
... 
>>> t3 = Timer("fact3(500)", "from __main__ import fact3")
>>> print t3.timeit(number = 500)
0.354646205902

>>> def fact4(n): return reduce(lambda x,y: x*y, xrange(1,n+1))
... 
>>> t4 = Timer("fact4(500)", "from __main__ import fact4")
>>> print t4.timeit(number = 500)
0.479015111923

>>> def fact5(n):
...     x = 1
...     for i in range(1, n+1):
...             x *= i
...     return x
... 
>>> t5 = Timer("fact5(500)", "from __main__ import fact5")
>>> print t5.timeit(number = 500)
0.388549804688

누구나 내 결과를 교차 확인하려면 내 파이썬 버전입니다.

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2

실제로 가장 간단한 옵션은 다음과 같습니다.

def factorial(n):
    x = n
    for j in range(1, n):
        x = j*x
    return x

예, 어떻게 든 작동합니다.

이것에 대해 어떻게 생각할 수 없습니까? 모르겠어요.

for 루프와 승수, 정말 단순함은 가장 좋은 방법입니다.

편집 : 아, 잠깐, 우리는 가장 CPU- 효과적인 방법을 위해 일하고 있습니까? 오 오 .....

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top