|
|
1
7
这样做会“更好”(缺点x y)。 但是为了 回答问题 ,这样做没什么错:)(只是稍微慢一点)。 |
|
|
2
5
我认为这里的答案是资源利用率(如下 This post ) 例如在clisp中:
|
|
|
3
3
dsm:你的代码有一些奇怪的地方 here 请注意
相当于:
这可能不是你想要的。注意三件事:首先,按照你写的方式,x和y具有相同的角色。你可能想嵌套循环。其次,你在y后面的do是不正确的,因为后面没有lisp形式。第三,你可以在这里使用回溯方法,这是对的,但这会使你的代码更难阅读,而且不符合习惯,所以最好避免。 猜测你的实际意图,你可以这样做(使用循环):
如果你不喜欢循环宏(比如Kyle),你可以使用另一个迭代构造,比如
如果你发现自己经常做这类事情,你可能应该为交叉列表编写一个更通用的函数,然后将这些整数列表传递给它 如果你真的在迭代方面有问题,而不仅仅是循环,你可以递归地做这类事情(但请注意,这不是方案,你的实现可能无法保证TCO)。Kyle展示的“genint”函数 here 是常见(但不是标准)功能iota的变体。然而,添加到列表中是一个坏主意。类似这样的等效实现:
应该更有效率,但仍然不是最后的决定。注意,我已经为更常见的从0开始设置了这个,但给了你一个可选参数,可以从1或任何其他整数开始。当然,上述内容可以写成:
它的优点是不会因为大争论而大发雷霆。如果你的实现支持尾部调用消除,你还可以通过这样做来避免递归运行不到位:
希望这能有所帮助! |
|
|
4
1
为什么不只是
顺便说一句,我试图在CLISP中运行你的代码,但它没有按预期工作。由于我不太喜欢循环宏,以下是递归完成相同任务的方法:
|