1

以下は #, %1, %2 を使ってコーディングできますか?

(defn fib-step [[a b]]
  [b (+ a b)])

(defn fib-seq []
  (map first (iterate fib-step [0 1])))

user> (take 20 (fib-seq))
(0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181)

要するに、# および % 構文シュガーを使用して vector -> vector 関数を記述する方法を知りたいのです。

ありがとう

4

4 に答える 4

3

#()リーダー フォームと->スレッド マクロを使用して、ベクトルを簡単に生成できます。たとえば、次の 2 つの関数は同等です。

(fn [a b] [b a])
#(-> [%2 %])

ただし、あなたの場合のように、構造化を行う必要がある場合はfn、明示的なパラメーター リストを持つフォームの 1 つに固執するのが最善です。あなたが得る最高の#()ものは次のようなものです:

#(-> [(% 1) (+ (% 0) (% 1))])

また

#(-> [(% 1) (apply + %)])

高階juxt関数を使用することは、ベクトルを作成するもう 1 つの優れた方法ですが、残念ながら、この場合もあまりメリットがありません。

(def fib-step (juxt second #(apply + %)))

fnすべてのオプションの中で、分割を簡単にサポートできるため、使用が依然として最適であると思います。

(fn [[a b]] [b (+ a b)])
于 2013-07-02T01:30:13.820 に答える
0

コードは次のとおりです。

(def step #(-> [(% 1) (+ (% 0) (% 1))]))
(def fib #(map first (iterate step [0 1])))

(println 
 (take 20 (fib))
)

また

(def step #(-> [(% 1) (+ (% 0) (% 1))]))
(def fib (->> [0 1]
              (iterate step)
              (map first)))

(println
  (->> fib 
       (take 20))
))
于 2013-07-02T02:50:26.880 に答える
0

関数を使用することは、 「トリック」vectorよりも明確だと思います。(-> [...])

#(vector (% 1) (apply + %))

この例では、構造化を使用して、名前付き関数を使用するか、(fn [...] ...) とにかく使用します。

于 2013-07-02T06:28:55.357 に答える