web-dev-qa-db-ja.com

再帰的階乗関数

これらの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つの再帰関数にします。

10
user531225
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
27
pythonFoo

2行のコード:

def fac(n):
    return 1 if (n < 1) else n * fac(n-1)

試して:

print fac(4)

結果:

24
24
martynas

短いもの:

def fac(n):
    if n == 0:
        return 1
    else:
        return n * fac(n-1)
print fac(0)
6
Ilyas
def factorial(n):
    result = 1 if n <= 1 else n * factorial(n - 1)
    print '%d! = %d' % (n, result)
    return result
5
Will McCutchen
fac = lambda x: 1 if x == 0 else x * fac(x - 1)
3
T-kin-ter

私は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
3
Mchl

これを試して:

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を返します。あなたはそれを修正したいかもしれません。

3
Vinay Pandey

もう一つ

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))
2
MattyW

たまたまこの宿題ですか?

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=を使用すると、関数内で関数を定義できます。

2
D.Shawley

この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)))
1
Meir Keller

負の数の階乗は本当にわかりませんが、これはすべての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'
1
Salah Hamza

そして初めて、再帰とwhileループを使用して階乗を計算します。

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

TrebledJifの使用に関するコメントに書いたオプションの方が優れていますが。 whileループはより多くの操作を実行するため(SETUP_LOOP, POP_BLOCKifより。機能が遅くなります。

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

timeit -n 10000 -r 10

  • whileループあたり836 µs±11.8 µs
  • ifループあたり787 µs±7.22 µs
1
Szczerski

再帰関数には常にある種のループと、ループを停止するいくつかの停止コードがあります。

public int recursivefactorial(int number)
{
    if(number==1)
        return 1;
    else
        return recursivefactorial(number-1)*number;
}

ご覧のとおり、if条件を満たすと、実際に「ループ」を終了するコードにつながり、これが再帰関数の最も重要な部分です。対照的に、条件のelse部分は、recursivefactorial関数をもう一度呼び出すことにつながります。これは、一種のループです。

0
Ali