【问题标题】:Too many recursions at a time一次递归太多
【发布时间】:2021-11-02 06:44:58
【问题描述】:

我想创建一个程序来确定是否可以构造一个特定的 使用 recursion 使用特定数量的硬币进行总计。 例如,如果它们都是 25 美分硬币,那么使用四枚硬币可以获得总计 1.00 美元。但是,没有办法拥有 总共 1.00 美元,使用 5 个硬币。然而,使用 6 个硬币可以得到 1.00 美元,方法是使用 3 季度,2 角钱和 5 美分。同样,使用 5 可以形成总计 1.25 美元 硬币或 8 个硬币,但不能用 4、6 或 7 个硬币形成总计 1.25 美元。它应该显示一条清晰的消息,指示输入的美元是否 可以使用指定的硬币数量形成金额

def possiblechange(total, coins):
    penny = .01
    nickel = .05
    dime = .1
    quarter = .25
    if coins * penny == total:
        return True
    elif nickel * coins == total:
        return True
    elif dime * coins == total:
        return True
    elif quarter * coins == total:
        return True
    else:
        return (
            penny*possiblechange(total, coins) or 
            nickel*possiblechange(total, coins) or 
            dime*possiblechange(total, coins) or
            quarter*possiblechange(total, coins)
        )
print(possiblechange(1.0, 3))

我对此进行了追溯。

【问题讨论】:

  • 我不明白为什么函数在基本情况下返回布尔值,但在递归情况下返回数字。
  • 我刚刚修好了
  • 它仍然将数字和布尔值相乘。 penny * possiblechange(...) 应该是什么意思?并且再次使用相同的参数递归调用该函数,这会导致无限递归。

标签: python python-3.x recursion


【解决方案1】:

您必须从每个递归调用中减去总数和硬币。另外,将硬币的价值乘以布尔结果有什么意义?例如,用 possiblechange(total - querter, coins - 1) 代替quarter*possiblechange(total, coins)

【讨论】:

    【解决方案2】:

    您遇到了一些问题。

    最大的问题是您的代码每次都使用完全相同的参数进行递归。这意味着如果您的基本案例之一未处理初始调用,您将永远递归。您需要修改递归调用的参数,因此它们所做的事情与您在当前调用中所做的事情不同。

    实际上,您的递归案例根本没有任何意义。您的函数应该返回 TrueFalse,但您正在对一堆美元值进行数学运算。

    我认为你想要这样的递归案例:

    return (
        possiblechange(total-penny, coins-1) or
        possiblechange(total-nickel, coins-1) or
        possiblechange(total-dime, coins-1) or
        possiblechange(total-quarter, coins-1)
    )
    

    下一个问题是您没有任何基本案例来处理失败。如果找不到工作集更改,则需要返回False。我建议:

    if total < 0 or coins == 0:
        return False
    

    最后一个问题是一个微妙的问题。您正在使用浮点数进行数学运算,这可能无法完全正常工作。您可能应该以美分而不是一美元的单位工作,以便可以准确地表示每个面额。

    【讨论】:

      【解决方案3】:

      python 递归限制设置为 1000。但是,如果您的计算机有足够的资源,您可以通过将此代码放在第一行来增加此限制:

      import sys
      sys.setrecursionlimit([NUMBER OF RECURSIONS])
      

      将 [NUMBER OF RECURSIONS] 替换为您需要的递归数。

      重要提示:您的函数确实返回布尔值和数字。请注意,Python 将布尔值视为运算中的数字:True 表示 1,False 表示 0。这可能是指导您的函数以超出所需递归方式的问题。

      【讨论】:

      • 当代码无限递归时,增加递归限制无济于事。
      猜你喜欢
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多