【发布时间】:2016-06-09 23:15:39
【问题描述】:
是否有内置函数或标准库函数大致相当于
def recur_until(start, step_fu, stop_predicate=lambda _: False):
current = start
while not stop_predicate(current):
yield current
current = step_fu(current)
或
def recur_while(start, step_fu, predicate=lambda _: True):
current = start
while predicate(current):
yield current
current = step_fu(current)
甚至只是
def recur(start, step_fu):
current = start
while True:
yield current
current = step_fu(current)
在任何版本的 Python 中? (后者与itertools.takewhile结合使用时与其他两个一样好。)
像这样的生成器函数将允许迭代地计算某些递归定义的序列,即一阶递归关系。
虽然这些在需要时实施起来并不难,但我觉得它们应该是itertools or maybe functools 的一部分,但如果是,我还无法在文档中找到它。
使用示例:
list(recur_until(2, lambda x: x**2 - 1, lambda x: x > 1e4))
# [2, 3, 8, 63, 3968]
也应该适用于非数字元素:
list(recur_until('', lambda x: '[{}]({})'.format(x, len(x)), lambda x: len(x) > 30))
# ['',
# '[](0)',
# '[[](0)](5)',
# '[[[](0)](5)](10)',
# '[[[[](0)](5)](10)](16)',
# '[[[[[](0)](5)](10)](16)](22)']
【问题讨论】:
-
即等效于 Haskell 的
iterate函数。iterate (\x -> x + 1) 0 = 0, 1, 2, 3, 4, 5, ... -
@chepner
iterate与takeWhile结合使用。 -
我不知道如何处理“X 存在吗?”这样的问题。我相信答案是“不”。除了链接到您已链接的文档之外,我无法证明该答案的合理性。
-
@SvenMarnach 是的。我专注于 itertools 中缺少的部分,但您确实需要
iterate和{take,drop}while的组合。 -
@DSM,是的,我知道存在问题的问题是否定答案基本上无法证明。但由于我对标准库在这里提供的内容特别感兴趣,所以我不知道如何以不同的方式提出我的问题。
标签: python recursion itertools recurrence functools