【问题标题】:Beginner python difficulties with for loop+recursive loopfor循环+递归循环的初学者python困难
【发布时间】:2018-06-17 00:24:34
【问题描述】:

我收到:

RecursionError: 比较中超出了最大递归深度

关于for循环的第一个定义。

我不知道发生了什么或我做错了什么。任何帮助将不胜感激。

我的代码:

initialbudget=3329
annualInterestRate=0.2
flat= 50
def formula(flat):
    '''
    input flat rate
    return low or correct
    '''
    balance=initialbudget
    for i in range(1, 13):
        balance=(balance-flat)*(1+annualInterestRate/12.0)
    if balance==0:
        return ('correct')
    elif balance>0:
        return ('low')



def rateFinder(initialbudget):
    '''
    input starting balance
    return Flat rate needed to pay off balance in 12 months
    '''
    flat=0 
    while formula(flat) != ('high'):
        if formula(flat)==('correct'):
            return('Lowest Payment:'+ ' ' + str(flat))
        else:
            flat+=10
            return(rateFinder(flat))

print(rateFinder(initialbudget))

【问题讨论】:

  • 您在rateFinder 中致电rateFinder。这只能发生在最大深度(默认 CPython 中为 1000)。你一定要超越它。想想你的逻辑,使用print 调用进行调试。
  • @houzayfarifai 我认为这不会有帮助,逻辑对我来说看起来不正确。例如,while 循环只运行一次迭代。
  • 我从未发现真正需要sys.setrecursionlimit() 的案例。
  • 只有当flat 恰好是(balance-flat)*(1+annualInterestRate/12.0) 为0 的正确值时,您的循环才会中断。您有理由相信最终肯定会出现这种情况吗?由于balance 不是以 10 的倍数开始的,在这种情况下,这实际上永远不会发生。
  • 我也不遵循逻辑。 Formula() 永远不会返回“高”,因此除非@Kirill 说余额完全等于 0,否则 while 循环将永远持续下去。

标签: python


【解决方案1】:

第一个问题是 rateFinder 中的flat=0 行。当 formula() 返回 ('low') 时,它使用更新后的 flat 值调用 rateFinder,然后将 flat 设置回 0。所以 ratefInder 应该如下所示:

def rateFinder(initialbudget, flat):
    '''
    input starting balance
    return Flat rate needed to pay off balance in 12 months
    '''
    while formula(flat) != ('high'):
        if formula(flat)==('correct'):
            return('Lowest Payment:'+ ' ' + str(flat))
        else:
            flat+=10
            return(rateFinder(initialbudget, flat))

修复该问题并将print flat, balance 放在formula() 中的for 循环之后,您会发现答案在300 到310 之间。因此您需要改进您的接受标准。

【讨论】:

  • 感谢您的回复。无论如何,我最终重新编码它并且它成功了。如果您好奇,这是我的解决方案
【解决方案2】:
annualInterestRate=0.2  
balance=320000

ib=balance
air=annualInterestRate
flat=-10

while balance !=0:
    flat+=10
    month=1
    balance=ib
    while month<=12:
        balance=(balance-flat)*(1+air/12.0)
        month+=1
    if balance<0:
        print('Lowest Payment:',round(flat, 2))
        break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    相关资源
    最近更新 更多