这个问题有很好的答案,我特别喜欢 thg435 的使用生成器的递归解决方案和 Marcin 的迭代解决方案,它将元素添加到引用列表中。
我还发现一些解决方案修改输入列表或使用全局状态令人不安。恕我直言,这违背了递归解决方案的真正精神。下面是我对 Python 中纯函数式递归解决方案的尝试——当然,有更多惯用和有效的方法来解决这个问题,但我想写一个答案,因为我会用纯函数式编程语言编写它:
# lst: the list to be processed
# acc: accumulated result
# stk: temporary stack
def process(lst, acc, stk):
if not lst:
return acc
elif lst[0] == 'b':
return process(lst[1:], [lst[0]], [acc] + stk)
elif lst[0] == 'c':
return process(lst[1:], stk[0] + [acc + [lst[0]]], stk[1:])
else:
return process(lst[1:], acc + [lst[0]], stk)
lst = ['a', 'a', 'a', 'b', 'a', 'a', 'b', 'a', 'c', 'a', 'b', 'a', 'a', 'c', 'a', 'c', 'a']
process(lst, [], [])
> ['a', 'a', 'a', ['b', 'a', 'a', ['b', 'a', 'c'], 'a', ['b', 'a', 'a', 'c'], 'a', 'c'], 'a']
需要注意的一些细节:
- 我不使用局部变量或全局变量,只使用函数参数来跟踪状态
- 我不使用赋值运算符
- 没有迭代器或循环用于遍历输入列表,只有递归
- It's a tail-recursive solution, although that's irrelevant in Python
- Only expressions are used; operations like
append
or extend
(which return None
) are avoided
- No lists are ever modified (including the input list), instead new lists are created as needed (using array slices for that)
- It's a rather short and elegant solution, but that might be a subjective opinion :)