これらの2つの関数を1つの再帰関数に結合して、この結果を得るにはどうすればよいですか。
factorial(6)
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
これらはコードです
def factorial( n ):
if n <1: # base case
return 1
else:
return n * factorial( n - 1 ) # recursive call
def fact(n):
for i in range(1, n+1 ):
print "%2d! = %d" % ( i, factorial( i ) )
fact(6)
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
これら2つを実行すると正しい答えが得られることがわかるので、1つの再帰関数にします。
def factorial( n ):
if n <1: # base case
return 1
else:
returnNumber = n * factorial( n - 1 ) # recursive call
print(str(n) + '! = ' + str(returnNumber))
return returnNumber
2行のコード:
def fac(n):
return 1 if (n < 1) else n * fac(n-1)
試して:
print fac(4)
結果:
24
短いもの:
def fac(n):
if n == 0:
return 1
else:
return n * fac(n-1)
print fac(0)
def factorial(n):
result = 1 if n <= 1 else n * factorial(n - 1)
print '%d! = %d' % (n, result)
return result
fac = lambda x: 1 if x == 0 else x * fac(x - 1)
私はPythonの経験はありませんが、このようなものですか?
def factorial( n ):
if n <1: # base case
return 1
else:
f = n * factorial( n - 1 ) # recursive call
print "%2d! = %d" % ( n, f )
return f
これを試して:
def factorial( n ):
if n <1: # base case
print "%2d! = %d" % (n, n)
return 1
else:
temp = factorial( n - 1 )
print "%2d! = %d" % (n, n*temp)
return n * temp # recursive call
私が気づいたことの1つは、n <1の場合に「1」を返すことです。つまり、関数は負の数の場合でも1を返します。あなたはそれを修正したいかもしれません。
もう一つ
def fact(x):
if x == 0:
return 0
Elif x == 1:
return 1
else:
return x * fact(x-1)
for x in range(0,10):
print '%d! = %d' %(x, fact(x))
たまたまこの宿題ですか?
def traced_factorial(n):
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
for i in range(1, n + 1):
print '%2d! = %d' %(i, factorial(i))
詳細は PEP227 を参照してください。 Python=を使用すると、関数内で関数を定義できます。
この4行のコードを使用できます...
def factorial(n):
f = lambda n: n * f(n - 1) if n > 1 else 1
for x in range(n):
print('{}! = {}'.format(x + 1, factorial(x + 1)))
負の数の階乗は本当にわかりませんが、これはすべてのn> = 0で機能します。
def factorial(n):
if n >= 0:
if n == 1 or n==0:
return 1
else:
n = n * factorial(n-1)
return n
else:
return 'error'
そして初めて、再帰とwhileループを使用して階乗を計算します。
def factorial(n):
while n >= 1:
return n * factorial(n - 1)
return 1
TrebledJ がif
の使用に関するコメントに書いたオプションの方が優れていますが。 while
ループはより多くの操作を実行するため(SETUP_LOOP, POP_BLOCK
)if
より。機能が遅くなります。
def factorial(n):
if n >= 1:
return n * factorial(n - 1)
return 1
timeit -n 10000 -r 10
while
ループあたり836 µs±11.8 µsif
ループあたり787 µs±7.22 µs再帰関数には常にある種のループと、ループを停止するいくつかの停止コードがあります。
public int recursivefactorial(int number)
{
if(number==1)
return 1;
else
return recursivefactorial(number-1)*number;
}
ご覧のとおり、if
条件を満たすと、実際に「ループ」を終了するコードにつながり、これが再帰関数の最も重要な部分です。対照的に、条件のelse
部分は、recursivefactorial
関数をもう一度呼び出すことにつながります。これは、一種のループです。