【问题标题】:stuck in recursion of clojure - missing a bracket陷入clojure的递归 - 缺少括号
【发布时间】:2013-10-24 18:44:59
【问题描述】:

我正在编写一个 clojure 递归函数,以便给出:

(luty [1 2 3 4])

应该有这样的输出:

((1 2 3 4) (2 3 4) (3 4) (4) ()

我的代码是:

(defn luty [a1]
 (if (empty? a1)
   (list )
     (cons (seq a1)  (luty (rest a1) )
  )))

我得到了输出:

((1 2 3 4) (2 3 4) (3 4) (4)) //comment missing a ()

谁能建议我哪里出错了?

【问题讨论】:

    标签: recursion clojure


    【解决方案1】:

    如果我们把流程打印出来,看看倒数第二个操作:

    user> (defn luty [a1]
            (println "a1 is" a1)
             (if (empty? a1)
                 ()
               (cons (seq a1) (luty (rest a1)))))
    #'user/luty
    user> (luty [1 2 3 4])
    a1 is [1 2 3 4]
    a1 is (2 3 4)
    a1 is (3 4)
    a1 is (4)
    a1 is ()
    ((1 2 3 4) (2 3 4) (3 4) (4))
    user> (cons '(4) ())
    ((4))
    

    我们可以看到,将(4) 添加到空列表的结果是((4)),而不是您可能想要的((4) ())。这可以通过使基本情况成为一个包含空列表的列表来解决,而不仅仅是一个空列表

    user> (defn luty [a1]
             (if (empty? a1)
               '(())
               (cons (seq a1) (luty (rest a1)))))
    #'user/luty
    user> (luty [1 2 3 4])
    ((1 2 3 4) (2 3 4) (3 4) (4) ())
    

    【讨论】:

      【解决方案2】:

      cons 的返回值是一个列表,第一个元素作为第一个参数,列表的其余部分作为第二个参数。如果第二个参数为空或 nil,则意味着您将获得一个列表,其中第一个参数作为单个成员。

      这样做的原因是列表(至少在 clojure 中是概念上的)具有 2 个空格单元格的链表;一个指向头元素的指针和一个指向尾元素的指针(另一个列表,在 clojure 中保证是类似 seq 的东西 - 在许多其他 lisps 中,您可以将第二个指针设置为您想要的任何值,所以你不是保证从那里的缺点中得到一个“正确的”列表)。 “尾部”位置的 nil 表示列表的结尾。

      列表是最容易实现和理解的持久性(在 clojure 的不可变、结构共享的意义上)数据结构。

      【讨论】:

        【解决方案3】:

        只是为了给你一个不同的看法:

        user> (defn luty [a1]
                (reductions (fn [c _] (rest c)) (or (seq a1) '()) (-> a1 count range)))
           => #'user/luty
        user> (luty [1 2 3 4])
           => ((1 2 3 4) (2 3 4) (3 4) (4) ())
        user> (luty [])
           => (())
        user> (luty nil)
           => (())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-23
          • 1970-01-01
          • 2015-03-31
          • 2016-08-16
          • 2018-04-10
          • 1970-01-01
          相关资源
          最近更新 更多