2

細かく作らないといけないようです;;それは私の宿題です。あなたが書いたコードをコピーしたくありません。私は初心者です。私が学ぼうとしているのは、主題を単一の断片に分解する方法であり、問​​題を解決するためにどの関数を使用する必要があるかに焦点を当てています。これらの問題を自分で解決するのは少し難しいです。なぜなら、私は Lisp のまったくの初心者であり、実際にはプログラミングの方法についてまったくの初心者だからです。あなたが私を助けてくれることを願っています。

ここに問題があります:与えられた定数があります

(defconstant *storms* '((bob 65)
                        (chary 150)
                        (jenny 145)
                        (ivan 165)
                        (james 120)))

各嵐は、名前と風速のリストで表されます。

風速は次のように分類されます。

39~74 → tropical
75~cat-1
95 → 96~110 → 111~130 cat-2
cat-3
131~155 → cat-4
156以上 →cat-5

ここで、2 つの関数を作成する必要があります。

  • storm-categories次のようなカテゴリ名を生成する必要があります: (bob tropical), (chary cat-1), …

  • storm-distribution次のように、各カテゴリの嵐の数を生成する必要があります: , (cat-1 1), (cat-2 0)

この問題を解決しようとする方法は次のとおりです。

  1. ステートメントを使用ifして、風速のタイプを判断します。

    (if (and (> x 39) (< x 73)) (print 'tropical)) (if (and (> x 74) (< x 95)) (print 'cat-1)) (if (and (>) x 96) (< x 110)) (print 'cat-2)) (if (および (> x 111) (< x 130)) (print'cat-3)) (if (および (> x 131) ( < x 155)) (print'cat-4)) (if (および (> x 156)) (print 'cat-5))

  2. 65風速 ( など) を windtype ( など) にcat-1置き換えます。

    (嵐の中の x のループ do (rplacd x 'windtype)

最初の関数の簡単なアイデアはありますが、実装方法はまだわかりません。私はまだ最初の機能で立ち往生しているので、配信機能には触れていません。

4

3 に答える 3

4

DEFCONSTANTが間違っています。入力を一定にするのは意味がありません。DEFVARまたはDEFPARAMETERで定義された変数で問題ありません。

IFの代わりにCONDを使用します。CONDを使用すると、いくつかの条件をテストできます。

PRINTを使用したくない。なぜ何かを印刷するのですか。値を計算したい。

RPLACAも間違っています。これは破壊的な変更に使用されます。あなたはそれを望まない。新しい値を作成したい。RPLACAのようなものが関数DISTRIBUTIONで使用される可能性があります(以下を参照)。

機能的抽象化を使用します。どの機能が便利ですか?

  • BETWEEN-Pは、aとbの間の値Xですか?

  • STORM-CATEGORY、特定の風速に対してカテゴリを返します

  • STORM-CATEGORIES、アイテムのリスト(嵐の風速)については、アイテムのリスト(嵐のカテゴリ)を返します。入力リストにマップして、結果リストを作成します。

  • DISTRIBUTION、アイテムのリスト(タグカテゴリ)の場合、アイテムを含むリスト(カテゴリこのカテゴリのタグの数)を返します。

  • STORM-DISTRIBUTION、アイテムのリスト(ストームカテゴリ)の場合、アイテム(このカテゴリのストームのカテゴリ番号)を含むリストを返します。これは基本的に、適切なパラメーターを使用してDISTRIBUTIONを呼び出します。

関数DISTRIBUTIONは、上記の中で最も複雑です。通常、発生のカウントを維持するための中間ヘルプとして、ハッシュテーブルまたはassocリストを使用します。入力リストにマップし、対応するカウントを更新します。

また、基本的なLispの良い入門書は、Common Lisp:A Gentle Introduction toSymbolicComputationという本です。PDFとして無料でダウンロードできます。Lispのもっと楽しくて基本的な紹介は、LandofLispという本です

于 2011-09-10T00:55:37.700 に答える
1

わかりましたロッチャ、あなたはあなたの答えを投稿しました。これは数分でハッキングされたものですが、いくつかのアイデアが得られるはずです。

まず、データから始めましょう。

(defparameter *storms2004*
  '((BONNIE 65)
    (CHARLEY 150)
    (FRANCES 145)
    (IVAN 165)
    (JEANNE 120)))

(defparameter *storm-categories*
  '((39  73  tropical-storm)
    (74  95  hurricane-cat-1)
    (96  110 hurricane-cat-2)
    (111 130 hurricane-cat-3)
    (131 155 hurricane-cat-4)
    (156 nil hurricane-cat-5)))

値が 2 つの境界の間にあるかどうかをチェックする関数。右境界も欠落している可能性がある場合 (NIL)。

(defun between (value a b)
  (<= a value (if b b value)))

Lisp では、3 つ以上の引数を持つ比較述語を使用できることに注意してください。

嵐のカテゴリを見つけてみましょう。Lisp は機能し、リスト内のものFINDFIND-IF検索します。

(defun storm-category (storm-speed)
  (third (find-if (lambda (storm)
                    (between storm-speed (first storm) (second storm)))
                  *storm-categories*)))

各嵐のカテゴリを計算してみましょう。(嵐の風速) のリストを取得するので、リストのカテゴリを計算する関数をマップするだけです。嵐とカテゴリのリストを返す必要があります。

(defun storm-categories (list)
  (mapcar (lambda (storm)
            (list (first storm)
                  (storm-category (second storm))))
          list))

ここで、ストームの同じリストを取得しますが、ハッシュ テーブルを使用して、各カテゴリに含まれるストームの数を追跡します。MAPCに似MAPCARていますが、ハッシュ テーブルを更新する副作用のみです。ÌNCF はカウントを増やします。ハッシュテーブルを埋めたら、それを でマッピングする必要がありますMAPHASH。テーブル内のキーと値のペアごとに、そのペアを結果リストにプッシュし、その結果を返します。

(defun storm-distribution (storms)
  (let ((table (make-hash-table)))
    (mapc (lambda (storm)
            (incf (gethash (second storm) table 0)))
          (storm-categories storms))
    (let ((result nil))
      (maphash (lambda (key value)
                 (push (list key value) result))
               table)
      result)))

テスト:

CL-USER 33 > (storm-category 100)
HURRICANE-CAT-2

CL-USER 34 > (storm-categories *storms2004*)
((BONNIE TROPICAL-STORM)
 (CHARLEY HURRICANE-CAT-4)
 (FRANCES HURRICANE-CAT-4)
 (IVAN HURRICANE-CAT-5)
 (JEANNE HURRICANE-CAT-3))

CL-USER 35 > (storm-distribution *storms2004*)
((HURRICANE-CAT-5 1)
 (HURRICANE-CAT-4 2)
 (HURRICANE-CAT-3 1)
 (TROPICAL-STORM 1))

私にはうまく見えます。

于 2011-09-14T08:21:50.363 に答える
0

最後にこの問題を終了しました。2番目の部分は本当に私を夢中にさせます。ハッシュテーブルまたはアソシエート リストを使用してそれを保存する方法がわかりません。とにかく、割り当ては完了しましたが、どうすれば簡単にできるか知りたいです...皆さんが私を助けてくれることを願っています. 助けてくれてありがとう Joswing、あなたのアイデアは本当に私を大いに助けてくれます...

(defconstant *storms2004* '((BONNIE 65)(CHARLEY 150)(FRANCES 145)(IVAN 165)(JEANNE 120)))

(defun storm-category (x) ; for given windspeed return the category
(cond
((and (> x 39) (< x 73) 'tropical-storm))
((and (> x 74) (< x 95) 'hurricane-cat-1))
((and (> x 96) (< x 110) 'hurricane-cat-2))
((and (> x 111) (< x 130) 'hurricane-cat-3))
((and (> x 131) (< x 155) 'hurricane-cat-4))
( t 'hurricane-cat-5)

)
);end storm-category

(defun storm-categories (lst) ;for a list of storm and windspeed return storm's name and wind type
(let ((result nil))
(dolist (x lst (reverse result)) ;
(push
(list (first x) (storm-category (second x)) ) result)
)

)

);end storm-categories

    (defun storm-distribution (lst)
    (setq stormcategories '(tropical-storm hurricane-cat-1 hurricane-cat-2 hurricane-cat-3 hurricane-cat-4 hurricane-cat-5))
    (setq stormlist (storm-categories lst))
     (let(    (tropicalcount 0)
              (hurricane-cat-1count 0)
              (hurricane-cat-2count 0)
              (hurricane-cat-3count 0)
              (hurricane-cat-4count 0)
              (hurricane-cat-5count 0)
              (result nil)
         )

    (dolist (y stormlist )

    (cond
         ((eql (second y) 'tropical-storm) (setq tropicalcount (+ tropicalcount 1)))
         ((eql (second y) 'hurricane-cat-1) (setq hurricane-cat-1count (+ hurricane-cat-1count 1)))
         ((eql (second y) 'hurricane-cat-2) (setq hurricane-cat-2count (+ hurricane-cat-2count 1)))
         ((eql (second y) 'hurricane-cat-3) (setq hurricane-cat-3count (+ hurricane-cat-3count 1)))
         ((eql (second y) 'hurricane-cat-4) (setq hurricane-cat-4count (+ hurricane-cat-4count 1)))
         ((eql (second y) 'hurricane-cat-5)(setq hurricane-cat-5count (+ hurricane-cat-5count 1)))
    )
    );ebd dolist


    (push
          (list  (list 'tropicalstorm tropicalcount ) 
                 (list 'hurricane-cat-1 hurricane-cat-1count) 
                 (list 'hurricane-cat-2  hurricane-cat-2count ) 
                 (list 'hurricane-cat-3  hurricane-cat-3count ) 
                 (list 'hurricane-cat-4  hurricane-cat-4count ) 
                 (list 'hurricane-cat-5  hurricane-cat-5count ) 
          ) ;end list
    result) ;end push

    );end let

    );end distribution
于 2011-09-14T07:27:44.917 に答える