我的代码引发了递归错误。有人可以向我解释我的递归基础代码有什么问题吗?

时间:2019-04-03 15:01:09

标签: python recursion

我正在确定最低还款额,以确保12个月后债务能全部清偿

未付信贷余额每月按(a / 12)%的比例计算

我刚刚开始学习递归,却无法弄清楚为什么我的递归基本代码是错误的。控制台抛出递归错误。这是代码的一部分。

  

#minPayment(3329,0.2)

def minPayment (cb, a):

'''
cb = initial credit balance
a = annual interest (in decimals)
'''

  x = 0
  unpaid = cb-x
  inc = (cb-x)*(a/12)

  def mintha (x):
     totalPay = unpaid + inc

     if (12*x - totalPay) >= 0:
         return x

     else:
         totalPay = unpaid + inc
         return mintha (x+10) 


 return mintha (x)

预期结果= 310
实际结果= 290

2 个答案:

答案 0 :(得分:0)

代码的一些问题:

  • 在函数SELECT o.* FROM objects AS o WHERE o.modifieddate >= ( SELECT MAX(v.Criteria) FROM ( VALUES (<SearchTerm_1>) ... ,(<SearchTerm_N>) ,(20190401) --<-- Your Default Value ) AS v (Criteria) ); 的返回语句中再次调用函数mintha,这可能导致无限循环
  • return mintha(x)子句的return语句中:else您将再次调用该函数。如果达到最大深度,则可能导致递归问题。

因此,我们更正代码并为return totalPay and mintha (x+10)xcb分配一些假设值,然后尝试一下。返回值时,我们将它们舍入到最接近的整数。

a

P.S .:我不确定这个问题背后的数学原理。

答案 1 :(得分:0)

在不知道所有变量可以具有什么值的情况下很难看到发生的事情,但是我可以这样说:

  1. 似乎永远不会到达最底端的return mintha(x),因为上面if / else中的每个子句都将返回内容。

  2. return totalPay and mintha (x+10)结尾的else子句的行为有点不直观。如@MichaelVeksler上面指出的,如果mintha(x+10)为假(即0),它将返回totalPay,否则将返回totalPay

因此,如果您编写的逻辑/其他逻辑是这样,则函数返回:

if (12*x - totalPay) >= 0:
    return x
else:
    if totalPay == 0:
        return totalPay
    else:
        return mintha (x+10) # recurse

我将仔细检查条件if (12*x - totalPay) >= 0:并确保其最终评估为true,因为这会使您脱离无限递归。 (似乎totalPay每增加一个totalPay = unpaid + inc语句后,totalPay都会增加,这似乎永远不会成为事实。)

打破无限递归的另一种方式是,如果using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class AutoClick : MonoBehaviour { #region VARIABLES Button button; GameManager gm; bool bought; public float autoclickCost; public string autoclickText; public float autoclickCurrent; #endregion #region START void Start() { gm = FindObjectOfType<GameManager>(); button = GetComponent<Button>(); button.interactable = false;//la propiedad la settea en false, el boton aparece desactivado bought = false; //ponemos el bool a false tambien, por que no hay nada comprado al empezar GetComponentInChildren<TMPro.TextMeshProUGUI>().text = autoclickText;//en el start busca en el boton un hijo que sea un tmpro y va a su propiedad text y la iguala a la variable } #endregion #region UPDATE void Update() { if (!bought && gm.currentNumber >= autoclickCost)// si tenemos puntos y la mejora no esta comprada se nos hace activo el boton sino nada. { button.interactable = true; } else { button.interactable = false; } gm.currentMultiplierAutoclick += gm.AddNumberAutoclick; } #endregion #region UPGRADE public void UpgradeMethod() { gm.BuyUpgradeAutoclick(this); } #endregion #region DISABLE UPGRADE public void DisableUpgrade()// para que solo puedas comprar la mejora una unica vez { button.interactable = false;// desactivamos el boton bought = true;//damos la compra por adquirida } #endregion } ```` 为0,但是我不确定这是否是预期的。

  

注意:此答案并不涉及代码产生有意义答案的问题,它只是试图解释为什么发生无限递归。