【问题标题】:correction of recursive generator code递归生成器代码的更正
【发布时间】:2017-06-16 13:12:04
【问题描述】:

首先,感谢您的帮助。我有这个递归代码,用于计算硬币列表和给定数量的变化方式。我需要编写一个递归生成器代码,以呈现每次找零的方式。例如,如果你得到 5 的数量和 [1,2,3] 个硬币的列表,那么这将是输出:

for e in change_gen(5,[1,2,3]):
     print(e)

 [1, 1, 1, 1, 1]
 [1, 1, 1, 2]
 [1, 2, 2]
 [1, 1, 3]
 [2, 3]

这是我尝试过的: 怎么了?

使用 binom 和 pascal 等算法的代码 {n \choose k}={n-1 \choose k-1}+{n-1 \choose k}

def change_gen(amount, coins):
    if amount == 0:
       yield []
    elif not (amount < 0 or coins == []):
       g = change_gen(amount, coins[:-1])
       f = change_gen(amount - coins[:-1],coins)
       while True:
            yield Next(g)
       yield coins[:-1].extend(next2(f))

【问题讨论】:

  • Nextnext2 来自哪里?另请注意,list.extend 返回 None... 并且 - 它是递归的吗?这通常是一个非常适合动态/约束方法的问题。
  • next2 是错误的。是的,以递归方式编写它是一项任务。解决方案应如下所示: def change_gen(amount, coin): if amount == 0: yield elif not (amount
  • 仍然没有解释 Next 来自哪里 - 您可以在 edit 您的问题中包含此类信息和更正
  • 接下来是在python中调用一个迭代
  • 我认为 - 但它没有大写字母 N :) 当您提出问题时,请尝试使您正在使用的实际代码准确无误 - 在尝试调用Next 的时刻将是NameError,即使您很可能是要使用next

标签: python python-3.x recursion generator


【解决方案1】:

您的递归是正确的:减少硬币和减少数量的递归。这是一个更正的实现,添加了测试用例。

def change_gen(amount, coins):
    if amount == 0:
       yield []
    elif amount > 0 and coins:
        coin = coins.pop()
        yield from change_gen(amount, coins)
        coins.append(coin)
        for lis in change_gen(amount - coin, coins):
            lis.append(coin)
            yield lis

changes = list(change_gen(5, [1,2,3]))
print(changes)
assert changes == [
 [1, 1, 1, 1, 1],
 [1, 1, 1, 2],
 [1, 2, 2],
 [1, 1, 3],
 [2, 3],
]

断言通过。

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2019-08-25
    相关资源
    最近更新 更多