簡體   English   中英

如何防止在 Python 中實現階乘的遞歸錯誤

[英]How to prevent a recursion error implementing factorial in Python

我正在開發一個數學套件,目前在實現階乘 function 的遞歸版本時遇到問題。 問題是當我在我的貝葉斯組合 function 中使用它時:

C(n,k) = n! / k! * (n-k)! 

我已經獨立測試過它並且它應該可以正常工作,但是一旦我將它放入我的組合 function 中,我就會收到錯誤Recursion Error: maximum recursion depth exceeded in comparison ,即使對於非常小的 n 和 k 值。

我已經實現了一個完美運行的迭代解決方案,那么為什么我不斷收到遞歸錯誤?

這是遞歸實現:

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

這是迭代實現:

def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

它們在 function 組合中使用,如下所示:

def combination(n, k):
    result = factorial(n) / (factorial(k) * factorial(n - k))
    return result

遞歸 function 似乎僅在 k = 1 時才有效。

以下是一些產生遞歸錯誤的示例輸出:

combination(2,1) = 2

combination(2,2) = 

Traceback (most recent call last):
  File "baysian.py", line 44, in <module>
    answer = combination(n, k)
  File "baysian.py", line 18, in combination
    result = factorial(n) / (factorial(k) * factorial(n - k))
  File "baysian.py", line 9, in factorial
    return n * factorial(n - 1)
  File "baysian.py", line 9, in factorial
    return n * factorial(n - 1)
  File "baysian.py", line 9, in factorial
    return n * factorial(n - 1)
  [Previous line repeated 994 more times]
  File "baysian.py", line 6, in factorial
    if n == 1:
RecursionError: maximum recursion depth exceeded in comparison

這個頁面:

import sys
print(sys.getrecursionlimit())

然后調整:

sys.setrecursionlimit(<number>)

如果你輸入的數字太高,你的機器會崩潰

事實證明,我的遞歸階乘實現是不正確的。 它將返回 0 for.0 而不是 1。我添加了一些更改,現在它可以工作了。 這是我修改后的解決方案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM