我正在尝试在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))
有人可以告诉我我失踪了吗?谢谢。我试图让它输入数字,然后打印出来。
答案 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
。
这是以下陈述的编码等同物:
所以你可以看到使用递归你需要将你的问题分解为基本情况,你可以在那里停止递归,以及递归步骤,其中您可以根据更简单的问题来定义问题。在这个例子中,我们的基本情况是,零年后,本金没有变化,递归步骤是每年我们将利率一次应用于上一年的本金。确保您的递归始终终止非常重要 - 即应用重复步骤的结果总是最终会导致基本情况。
请注意,在更复杂的问题中,您可能有多个不同的基本情况,也可能有多个不同的递归步骤。你也可以进行更复杂的递归,其中一组相关的函数互相调用,但如果你使太复杂,那么很难说服自己没有像无限递归这样的问题。
最后一点是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