我正在确定最低还款额,以确保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
答案 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)
,x
和cb
分配一些假设值,然后尝试一下。返回值时,我们将它们舍入到最接近的整数。
a
P.S .:我不确定这个问题背后的数学原理。
答案 1 :(得分:0)
在不知道所有变量可以具有什么值的情况下很难看到发生的事情,但是我可以这样说:
似乎永远不会到达最底端的return mintha(x)
,因为上面if / else中的每个子句都将返回内容。
以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,但是我不确定这是否是预期的。
注意:此答案并不涉及代码产生有意义答案的问题,它只是试图解释为什么发生无限递归。