用递归Python替换迭代

时间:2017-06-19 20:16:26

标签: python recursion iteration

我刚刚开始学习EdX课程的递归,并且我已经编写了一个迭代函数来计算12个月之后支付最低要求金额后的剩余余额。

我能够通过迭代轻松完成它,但我似乎无法绕过递归方式。

请指出正确的方向。

这是我的迭代函数

def remaining_balance_iter(balance,annualInterestRate, monthlyPaymentRate ):
  '''
  This code will take any balance and annual interest rate and calculate the 
  balance after one year of making the minimum payments
  '''

  month = 1
  monthly_interest_rate = annualInterestRate/12.0

  while month <= 12:

    minimum_monthly_payment = monthlyPaymentRate * balance

    monthly_unpaid_balance = balance - minimum_monthly_payment

    balance = monthly_unpaid_balance + monthly_interest_rate*monthly_unpaid_balance

    print( "Month {} Remaining balance: ".format(month) + str(round(balance,2)))

    month += 1

  print ("Remaining balance " + str(round(balance,2)))

我尝试了一个递归函数,但它需要工作,我需要辅导哈哈

def remaining_balance_recur(balance,annualInterestRate, monthlyPaymentRate, month ):
  '''
  This code will take any balance and annual interest rate and calculate the 
  balance after one year of making the minimum payments
  '''

  month = 1
  monthly_interest_rate = annualInterestRate/12.0

  while month <= 12:

    minimum_monthly_payment = monthlyPaymentRate * balance

    monthly_unpaid_balance = balance - minimum_monthly_payment

    interest = monthly_interest_rate*monthly_unpaid_balance

    balance = remaining_balance_recur(monthly_unpaid_balance, annualInterestRate, monthlyPaymentRate, month + 1) + interest

  print ("Remaining balance " + str(round(balance,2)))

2 个答案:

答案 0 :(得分:0)

我发现处理递归的最好方法是从指定基本情况开始。当你完成方法时,告诉你的条件是什么?在您的代码中,看起来您运行您的方法直到`month&gt; 12',所以你的基本情况是:

if month > 12:
    return 1 # 1 for the purpose of explanation

您的基本案例的返回值是您的函数的基本值。如果您的月份是12,您的脚本会返回什么?这就是你要回归的价值。

接下来是困难的部分。您必须弄清楚后续调用方法正在修改哪个变量。我不确定你的代码打算做什么,但看起来你对一些变量进行了一些计算。当您使用递归时,几乎就像您正在保存当前正在执行的方法调用的状态,同时检索语句所需的值。 (例如a_num = 1 + recurse(n - 1) - 在继续使用此语句之前,您需要recurse(n - 1)的值。这只是一个例子。查找受先前迭代影响的变量,并尝试进行递归。在您的情况下,balance似乎是变量:

balance = balance + remaining_balance_recur(annualInterestRate, monthlyPaymentRate, month + 1)
return balance

当您编写递归方法时,您总是需要在方法的末尾返回一些值,因此调用该方法的语句实际上会获得一个值。这是一个简短而无用的例子:

def recurse(n)
    if n == 0       # BASE CASE
        return 1
    some_sum = 0
    some_sum += recurse(n - 1)    # I need the value from recurse(n - 1)

    return some_sum    # This method was called somewhere, so it needs to return

尝试从这些提示中找出代码的递归解决方案。对不起,递归很难解释,特别是SO。 Youtube视频和谷歌对于理解一般的递归也是一个很大的帮助。希望这能给你一些想法。

答案 1 :(得分:0)

将&#34; month = 1&#34;在while语句之前,您正在重置它,以便当月&lt; = 12将永远运行。这会产生一个&#34; RecursionError:比较时超出了最大递归深度。&#34;

您的功能输出目前是&#34; NoneType&#34;因为它的输出是print语句而不是返回int或float。这会产生&#34; TypeError&#34;因为您试图在递归中将浮点数(利率)添加到NoneType(打印语句)。