如果迭代次数过多,使用@aleksei-astynax-pirogov 回答的递归将导致递归错误。相反,您可以隐藏函数内部状态的副作用。
def fp_while(pred, fun, acc):
v = acc
while(pred(v)):
v = fun(v)
return v
使用示例:
fp_while(lambda x: x < 5, lambda x: x + 1, 1)
print(fp_while(lambda x: x < 5, lambda x: x + 1, 1))
# outputs 5
使用生成器方法
下面的生成器方法将允许您在每次迭代时存储状态
def fp_while_generator(pred, fun, acc):
v = acc
while(pred(v)):
yield v
v = fun(v)
yield v # remove this if you do not want the last value that fails the check
使用示例:
my_while_generator = fp_while_generator(lambda x: x < 5, lambda x: x + 1, 1)
print([i for i in my_while_generator])
# outputs [1,2,3,4,5]
有关生成器的更多信息
https://realpython.com/introduction-to-python-generators/