实施
解决这个问题的方法是使用一个while循环的递归下降算法。这个循环的基本结构是:todo = [[item1, processing_data],[item2, processing_data], ... ]
done = []
while len(todo)>0:
item_to_workon = todo.pop()
for each_branch in branches:
stuff.do()
data.process()
if end_condition.met()
done.append(processing_data)
else
todo.append([stuff, processing_data])
return done
也就是说,从todo列表中弹出一个项目,处理该节点,并将结果节点放回todo列表(除非满足结束条件,否则在这种情况下结束)。然后在todo列表为空时返回done列表。
因此,它从第一个字母开始,尝试一个或两个元素组合,如果成功找到匹配项,则将项(剩余字符)与处理数据的一起放回todo列表,即元素列表。如果它在单词的其余部分用尽了可能的路径,而你还没有到达单词的结尾,那就意味着你不能用给定的元素拼写它。
我希望您会同意,这个实现比使用递归更干净、更容易理解。它的计算强度也较低,因为不需要在每个节点(即每个函数调用)重新定义一个具有自己作用域的新变量空间,从而使用较少的资源。