3

これは Common Lisp の最初の宿題の一部です。

0 から 100 までの任意の 10 個のランダムな整数を表す変数を定義する必要があります。ここで何が求められているのかわかりません。私は書くべきですか:(setf var1 '())

次に、10 個のランダムな整数のリストを生成し、それらの数値を含むリストを返す関数を定義する必要があります。

これが私が書いたものですが、出力としてNILを取得し続けています。コードの何が問題なのか知っていますか:

(setf *random-state* (make-random-state t))
(setf var1 '())


(defun randlist (var1)
(dotimes (i 10)
    (setf temp (random 101))
        (cons 'temp var1  ) ) )
4

5 に答える 5

8

10 個のランダムな整数を含む新しいリストを返す関数を作成します。

(defun randlist ()
  (let ((lst ()))
    (dotimes (i 10)
       (setf lst (cons (random 101) lst)))
   lst))

そして、その結果を変数に割り当てることができます:

(defvar var1 (randlist))

デモ

于 2012-09-30T23:57:52.487 に答える
7

そのように初期化する必要はありません*random-state*。とにかくそれがデフォルトです。乱数ジェネレーターの実装が異なる場合は、初期化する必要があります。

(setf whatever nil)おそらくうまくいきますが、これは変数を宣言する方法ではありません。setfシンボルに値を代入するためのマクロです。通常、最初にシンボルを作成してから割り当てます。動的変数が必要な場合、オプションはdefparamterまたはdefvarマクロです。例:

(defparameter var1 nil)
(defvar var2 nil)

これがマクロが返すものであり、これが関数で実行される最後のフォームであるため、関数randlistが返されます。return に変更することもできますが、特にこの方法で動的変数を使用することは、適切なコーディング方法ではありません。このタスクからは、10 個の整数のリストを返す関数を単純に作成するように求められたかのように聞こえます。それを関数外の動的変数に割り当てる必要もありません。nildotimesvar1

(defun randlist ()
  (loop for i from 0 below 10 collect (random 101)))

おそらくそれを行う最も簡単な方法でしょう。しかし、実際には他にもたくさんの方法があります:)

楽しみのために、ここに別の方法がありますが、特に優れているわけではありません。もっと短くしたかったのですが、実際にはそうではありませんでした:)

(defun random-list ()
  (mapcar #'random (make-list 10 :initial-element 101)))
于 2012-10-01T00:02:24.750 に答える
0

または、このようにすることもできます -

(defun rnd-list()
  (let (lst)
    (dotimes (n 100)
      (push (random 101) lst))
    (reverse lst)))
于 2013-03-12T23:45:22.340 に答える