1

リスト内の数字を数える一般的な LISP の関数を書くのを手伝ってくれる人はいますか? 私が書いたコードは以下のとおりですが、動作しません!

(defun count-numbers(lst)
    (let(result()))
    (dolist(number lst)
    (push number result))
    (length result))

たとえば、このクエリを入力すると"(count'(r 4 f d w 2 3 4 1 z))"、5 を取得する必要があります。

4

3 に答える 3

5

宿題なので、ヒントだけあげておきます。最初に: シンプルさ。Common-Lisp を初めて使用する場合は、その基本的な機能を使用してください。例:再帰。純粋に機能的なスタイルで。次のように考えてください。

(defun count (list counter) 
    ;; something
)

まずリストをチェックします。空の場合は、すでにすべての要素をチェックしているので、counterを返します。リストが空でない場合、

  1. 最初の要素を取る
  2. 数値かどうかをチェックします
  3. 数字です!リストの残りに対してcountを再帰的に呼び出し、 counter = counter + 1 を使用します。
  4. 数字じゃない!以前と同じように、 counterを使用してリストの残りの部分でcountを再帰的に呼び出します。

(numberp n) を使用します。nが数値の場合は T を返し、そうでない場合は NIL を返します。

于 2012-07-16T18:19:24.837 に答える
0
(defun count-numbers (lst)
  (let (result ()))
  (dolist (number lst)
     (push number result))
  (length result))

インデントを確認します。それはあなたが望んでいたものですか?そうでないかもしれない。

次に、すべての要素を結果リストにもプッシュしますか? それはあなたが望むものですか?

数値に関する関数のリストを次に示します。http://www.lispworks.com/documentation/HyperSpec/Body/c_number.htm 必要なものがあるかもしれません?

これはダウンロード用の優れた Lisp 入門書です: http://www.cs.cmu.edu/~dst/LispBook/

于 2012-07-16T18:11:20.170 に答える
0

これを解決するにはさまざまな方法があると思います.1つは、すでに書かれているほとんど正しい解決策、再帰カウント関数のような命令型ループです(CLには保証がないため、これはおそらく最悪の方法です'スタックを吹き飛ばす)、またはおそらく本番環境で実際に使用する機能的アプローチ。最後は次のようになります。

(defun count-numbers (list) (count-if #'numberp list))
于 2012-07-17T03:22:35.770 に答える