具有复合兴趣的Python递归

时间:2013-07-24 16:51:03

标签: 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))

有人可以告诉我我失踪了吗?谢谢。我试图让它输入数字,然后打印出来。

2 个答案:

答案 0 :(得分: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)

此代码假设费率以比率表示 - 例如,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

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

答案 1 :(得分:-2)

def compound_interest(prin,rate,year):
    if year<=0:

        return prin
    else:
        return compound_interest(prin+prin*rate/100,rate,year-1)

 compound_interest(100000,12,3)
 140492.8