具有复利的Python递归

mil*_*loJ 0 python recursion

我正在尝试在Python中建立一个递归函数来查找复利。到目前为止,这是我的代码。

def compound_interest(principal, rate, years):
    return principal*(1 + rate)**years

def compound_interest_recursive(principal, rate, years)
    if years == 0:
        return principle
    else:
        return 



principal_str = input("Enter the principal ")
principal = int(principal_str)

rate_float = input("Enter the interest rate ")
rate = float(rate_float)

years_str = input("Enter the number of years ")
years = int(years_str)

print("Principal after", years,"year(s) is",compound_interest\
      (principal, rate, years))
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我所缺少的吗?谢谢。我试图让它输入数字,然后打印出来。

Car*_*roo 5

我假设您是作为编程练习递归执行的,也可以使用Maths™来完成。

在我看来,您没有compound_interest_recursive()递归调用任何地方。递归是(我在这里简化了一点)从内部调用函数。在我看来,您只想要这样:

def compound_interest_recursive(principal, rate, years):
    if years == 0:
        return principal
    else:
        return compound_interest_recursive(principal * rate, rate, years-1)
Run Code Online (Sandbox Code Playgroud)

此代码假定比率以比率表示-例如,15%为1.15

这是以下语句的编码等效项:

  • 零年后的化合物与本金相同。
  • N年后的复利是N-1年后的复利乘以利率。

因此,您可以看到要使用递归,您需要将问题分解为一个基本案例(可以停止递归)和一个递归步骤(可以从更简单的问题定义问题)。在此示例中,我们的基本情况是,零年后本金没有变化,递归步骤是每年我们对上一年的本金应用一次费率。确保递归始终终止非常重要,也就是说,应用递归步骤的结果将始终最终导致基本情况。

请注意,在更复杂的问题中,您可能有多个不同的基本案例,也可能有多个不同的递归步骤。您还可以具有更复杂的递归,其中一组相关函数相互调用,尽管如果使事情变得复杂,很难说服自己就不会遇到无限递归之类的问题。

最后一点是,Python最多有1000个递归调用(默认情况下),因此您不能将其用于涉及大量递归的问题。例如,超过1000年的复利将不适用于此方法。这是因为每次进行递归调用时,都会消耗更多的内存,最终将耗尽内存。Python通过对递归调用的数量设置一个简单的限制来保护您免于用尽内存,因为如果您递归进行的深度超过1000次,则很可能出错了。通常,如果您希望深度超过50-100级,则应该避免使用递归方法,但这是一个主观问题。

如果这是一个问题,那么您通常可以将递归问题实现为迭代问题,例如以下示例:

def compound_interest_iterative(principal, rate, years):
    for i in range(years):
        principal *= rate
    return principal
Run Code Online (Sandbox Code Playgroud)

当然,在您的情况下,简单的公式是最好的方法,但是在更复杂的问题中,诸如上述解决方案之类的迭代解决方案通常比递归解决方案消耗更少的内存并且运行(略微)更快。不利的一面是,对于某些类型的问题,编写迭代代码要比递归代码难。

  • 我知道人们对SO有不同的看法。我希望不要用汤匙喂他这个答案,因为我认为除非人们必须自己把它放在一起,否则他们不会真正“得到”这个答案。 (2认同)