例如,我想编写一个生成器来迭代一棵树。我可以使用递归函数调用吗?
Iterator<node> forallchildren(node) {
for (var n in node.children) {
yield n;
forallchildren(n);
}
}
看起来像递归调用只会生成迭代器,而不会像遍历树一样起作用。 有更好的方法吗?
答案 0 :(得分:4)
如果您将函数标记为yield
,则只能在返回Iterable
(而不是Iterator
)的函数中使用sync*
。
此外,要从Iterable
中产生元素,必须使用yield*
。
所以您可以像这样编写代码:
Iterable<Node> forallchildren(Node node) sync* {
for (var n in node.children) {
yield n;
yield* forallchildren(n);
}
}