几天前我问过有关找到most deeply nested lists的问题。我实现了给出的想法,并且它有效。
但还有另一个问题:我还需要从嵌套列表中构建一个列表。意思是:如果我将(8)
和(10 11 12)
更改为leaf1和leaf2,我需要返回:'(ans (leaf1 (8)) (leaf2 (10 11 12))
。 / ans是一个引用
换句话说:
我的功能会得到
(1 (2 3) (4 (5) (7 (8) (10 11 12))))))
=>最嵌套的列表是(8)
和(10 11 12)
=>我的函数将返回'(ans (leaf1 (8)) (leaf2 (10 11 12))
。
我想找个主意,不是实现。感谢。
答案 0 :(得分:1)
是的,这很容易做到。目前(如果我理解正确的话)你有一个递归函数,它下降一棵树并使用cons
来构建一个修改后的副本(其中最深层嵌套的列表被替换为某些东西)。这是树递归函数的常见模式,但没有理由他们必须返回与它们重复出现的输入具有相似结构的值。例如,您可以编写一个函数来遍历数字树并返回它们的总和。
在这种情况下,您可能希望保留树递归函数的基本结构,但使用cons
或可能append
来构建 flat 列表你找到的最深层次的嵌套列表。
我无法从你的问题中说出来,但你也可能正在寻找一种方法来编写一个返回两个单独值的函数:一个是更换了深层嵌套列表的树通过其他东西,另一个是替换位本身的平面列表。在这种情况下,您可能希望查看Scheme过程values
和call-with-values
,如果您的Scheme拥有它,则可能需要let-values
库。有关详细信息,请参阅Schemewiki常见问题here(向下滚动)。