2017-01-20 4 views
1

の最大は、Clojureのプログラムを作成してください: リストのClojure:リスト

(def boxes [33 11 44 22 66 55]) 

(println "List of box volumes:" boxes) 

(defn top-one [[big1 :as acc] x] 
    (cond 
    (> x big1) [x big1] 
    :else acc)) 

(defn top-one-list [boxes] 
    (reduce top-one [0] boxes)) 

(println "Biggest volume from boxes:" top-one-list) 
    (println "Biggest volume from boxes:" top-one-list) 

で最大の要素を見つけるために、機能の格言を定義しますが、出力結果は次のとおりです。66 44、それができた二つの数字を印刷

(> x big1) [x big1] 
2つの要素を返します

+4

を? – cfrick

答えて

3

にこの行を、私を助けて。あなたは1つしか必要ありません。あり

(defn top-one [big1 x] 
    (if (> x big1) 
    x 
    big1)) 

(defn top-one-list [boxes] 
    (reduce top-one 0 boxes)) 
+0

こんにちは、計算してくださいClojureプログラムを書くことができます 1 * 1 + 2 * 2 + ... + 100 * 100.私はクロージャのための新しいです – bin

+2

できます、あなたも試してみることができます:-)あなたが問題を説明する質問として投稿し、あなたがそれを解決するための研究であることを試したことを示すのに問題がある場合。 この回答があなたの質問を解決した場合は、それを確認して受け入れるべきです。 –

+0

こんにちは、1 * 1 + 2 * 2 + ... + 100 * 100を計算しようとするプログラムを貼り付けますが、エラー、任意のヘルプ – bin

1

:それを書くためのクリーンな方法は、リストを使用していないだろう

(> x big1) [x] 

が、還元プロセスの状態としてだけ数:

それはする必要がありますクロージャーでのデータ操作のいくつかの共通クラス。数年前にこの言葉が他の目的のために主張されたものの、その中にはパターンと呼ばれるものもあります。

  1. は共通で、既存の機能を見つける:

    この「摂餌」は、一般的には、カップルが近づいてありますが、これらのケースについては

    「単一の値に値の束を減らすこと」でありますすでにそれを行っているコアライブラリを使用しています。

  2. reduceファミリの1つを使用します。ここ

それぞれの例である:

まず、我々はそれを減らすと解決します:

user> (def boxes [33 11 44 22 66 55]) 
#'user/boxes 

user> (reduce max boxes) 
66 

を減らし、それが答え-こうしてここまでならば、それは仕事、最初のだそうであるよう2つの値を維持2番目のデータはその答えに含まれる必要があるデータです。それはまた、答えをvarと新しい情報とを取って、その情報を含む新しい答えを生むことである職務を追跡する。答えにすべての利用可能な情報が含まれていると、プロセスは停止します。この場合、決定機能としてmax機能を選択しました。

は、単に機能が内蔵され使用して:あなたは、リスト上で動作するように望んでいた一方で、それは、個別の引数の束がかかるため

user> (apply max boxes) 
66 

maxを明白な選択ではないかもしれません。これは一般的な状況であり、applyは、コレクションを引数として使用して関数呼び出しを作成することでうまく解決します。

(apply max [1 2 3]) 

が有効で、この関数の呼び出し次のようになります。

(max 1 2 3) 

とmaxは、効率的な引数のも、非常に多く取ることが幸せです: `max`を使用しない理由

user> (apply max (range 1e7)) 
9999999