使用以下命令的收益递归

时间:2018-09-01 18:43:33

标签: python python-3.x

我正在尝试编写一个使用“ yield / yield from”进行递归的分治函数。

def divide_and_conquer(number1, number2):
    print(f'[{number1}, {number2}]')
    if number1 != number2:
        mid = (number1 + number2) // 2
        yield from divide_and_conquer(number1, mid)
        yield from divide_and_conquer(mid+1, number2)

divide_and_conquer(0, 10)

据我所知,它应该以这种方式工作。当我从中删除收益但我正试图使用​​它时,该函数有效。

从中删除收益后,我会得到预期的结果:

[0, 10]
[0, 5]
[0, 2]
[0, 1]
[0, 0]
[1, 1]
[2, 2]
[3, 5]
[3, 4]
[3, 3]
[4, 4]
[5, 5]
[6, 10]
[6, 8]
[6, 7]
[6, 6]
[7, 7]
[8, 8]
[9, 10]
[9, 9]
[10, 10]

1 个答案:

答案 0 :(得分:2)

您使用的是奇怪的模式。您实际上是在创建生成器,但实际上并未return json_encode( ['data' => $scores] ); 进行任何操作。您的yield而不是print是不正确的。您可能想要返回(实际上是yield)现在要打印的值,所以只产生它们而不是打印它们。

yield

^这就是我认为应该重写您的代码的方式。但是,代码无法正常工作的核心原因是因为您认为自己正在调用一个将以递归方式执行的函数。但是您正在设置一个生成器,它不会对其自身进行迭代。为了给您一个想法,如果您触发生成器的迭代,您的代码仍然可以工作-但这不是您应该这样做的方式。参见上面的代码。

此方法有效,但应避免。

def divide_and_conquer(number1, number2):
    yield [number1, number2]
    if number1 != number2:
        mid = (number1 + number2) // 2
        yield from divide_and_conquer(number1, mid)
        yield from divide_and_conquer(mid+1, number2)

for i in divide_and_conquer(0, 10):
  print(i) 

如果只想在没有生成器的情况下运行函数,则可以按以下方式修改代码。现在,您的函数不再是生成器。请注意,您不会“返回”任何值,因此无法在函数外部使用创建的值。

def divide_and_conquer(number1, number2):
    print([number1, number2])
    if number1 != number2:
        mid = (number1 + number2) // 2
        yield from divide_and_conquer(number1, mid)
        yield from divide_and_conquer(mid+1, number2)

for _ in divide_and_conquer(0, 10):
  pass