1

私は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 ()

誰かが私が間違っている場所を教えてもらえますか?

4

3 に答える 3

1

別の見方をするために:

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)
   => (())
于 2013-10-26T20:51:48.953 に答える
1

cons の戻り値は、最初の要素が最初の引数で、リストの残りが2 番目の引数であるリストです。2 番目の引数が空または nil の場合、最初の引数を 1 つのメンバーとして持つリストを取得することを意味します。

この理由は、リストが (概念的には、少なくとも clojure では) 2 スペースのセルを持つリンクされたリストだからです。head 要素用の 1 つのポインターと tail 用の 1 つのポインター (別のリスト。これは clojure では seq のようなものであることが保証されています。他の多くの Lisp では、2 番目のポインターを任意の値に設定できるため、そこの短所から「適切な」リストを取得することが保証されています)。「末尾」の位置にある nil は、リストの終わりを示します。

リストは、最も簡単に実装でき、理解しやすい (不変で構造を共有するという clojure の意味での) 永続的なデータ構造です。

于 2013-10-24T19:44:43.813 に答える