【发布时间】:2020-10-27 01:28:59
【问题描述】:
我想找出实现以下指定函数的简洁、函数式和尾递归(如果可能)的方式:
(define (make-domain digits dimension)
;; Implementation)
;; Usage
(make-domain '(0 1) 0) => (())
(make-domain '(0 1) 1) => ((0) (1))
(make-domain '(0 1) 2) => ((0 0) (0 1) (1 0) (1 1))
(make-domain '(0 1) 3) => ((0 0 0) (0 0 1) (0 1 0) (0 1 1) (1 0 0) (1 0 1) (1 1 0) (1 1 1))
我更喜欢使用尽可能少的辅助函数或库函数的 Scheme 实现,但 SML 或 Haskell 也可以。我正在尝试找到可能使用相互或嵌套递归的尾递归解决方案,但目前没有运气。
非常感谢!
【问题讨论】:
-
这是我的爱好,也是我自己的调查。对我来说重要的是函数式尾递归算法(想法),而不是实现语言
-
是否是作业问题并不重要。如果问得好,它就是这里的主题,并且由提问者确保他们遵守学术诚实约束。如果它没有得到很好的要求,它应该被否决、关闭或编辑。在这种情况下,我认为这不是很好的问题,因为没有做出任何努力或尝试。这个功能已经实现了数百万次——“总的来说”还能说什么呢?只有与您对现有实现的哪些部分不了解的解释配对时,答案才会有用。
-
另外,这个问题不适合尾递归。您可以通过在堆上构建自己的堆栈来伪造它,但最终您需要
|m|^n内存来保存结果,因此避免n堆栈帧并不会真正产生任何重大影响。 -
Haskell 中的尾递归通常是一个坏主意,会导致代码变慢,尤其是在生成列表时。无论如何,即使它可能不是您想要的,您也可以在导入
Control.Monad之后在 GHCi 中尝试replicateM 5 "abc"。 -
@chi 可能是尾递归
foldl和惰性组合函数 is the right tool after all,严格、完全地构建 n “嵌套循环”,然后得到被懒惰地探索。 strict loop 来构建 lazy 嵌套循环...(Common Lisp 以使用宏为荣——首先构建代码,然后让它运行)
标签: haskell recursion functional-programming scheme sml