1

リストを出力する関数を書きたいです。この関数はリストを取得し、新しいリストを出力します。例えば:

(0 0 1 2 2 1) -> (3 4 4 5 5 6)).

それが何をするか: 初期リストの index+1 は、新しいリストの値です。そして、その値は、初期リストの値に応じて、新しいリストに x 回配置されます。

(1 2) -> (1 2 2)
(0 3 0 3) -> (2 2 2 4 4 4)

したがって、3 は 2 番目の位置にあり、値は 3 であるため、2 (2 番目の位置) は新しいリストに 3 回配置されます。

私はこれを思いついたが、うまくいかない

(defun change-list (list)
  (setq newlist '(1 2 3))
  (setq i 0) 
  (while (<= i (length list)) 
    (if (= (nth i list) 0)
      (concatenate 'list '0 'newlist)
    (concatenate 'list '(i) 'newlist))
    (+ i 1)
    (remove 0 newlist)))

問題は主に、新しい変数を認識しないことです。次のエラーが表示されました: functions.lisp:27:26: warning: Undefined function referenced: while

functions.lisp:31:2: 警告: 宣言されていない変数 newlist への自由な参照は特別なものと見なされます。警告: 宣言されていない変数への自由な参照 i は特別であると想定しました。

これを理解している人はいますか?


私たちはそれを自分で解決することができました:

(defun change-list (a) 
  (loop for j from 1 to (length a) by 1 append 
    (loop for i from 1 to (nth (- j 1) a) by 1 
      collect j )))

それはより大きな課題の一部であり、Lisp についてあまり教育を受けていませんでした。

4

3 に答える 3

2

これが Common Lisp であると仮定しましょう。次に、コードの問題点をいくつか挙げます。

(defun change-list (list)
  (setq newlist '(1 2 3))

SETQ変数を宣言せず、設定するだけです。

  (setq i 0) 
  (while (<= i (length list)) 

WHILECommon Lisp には存在しません。

    (if (= (nth i list) 0)
      (concatenate 'list '0 'newlist)

0リストではありません。したがって、連結することはできません。 CONCATENATE副作用はありません。ここで何をしても無駄です。 NEWLISTこれはシンボルであり、リストではありません。動作しません。

      (concatenate 'list '(i) 'newlist))

iここでは変数ではありません。リストに入れるとノーになります。 CONCATENATE副作用はありません。ここで何をしても無駄です。 NEWLISTこれはシンボルであり、リストではありません。動作しません。

    (+ i 1)

上記の効果は失われます。

    (remove 0 newlist)

上記の効果は失われます。

    ))
于 2012-06-26T17:03:21.210 に答える
1

これに対する答えを簡単にすることができます:

(defun change-list (list) 
  (loop for i in list and j from 1
        append (loop repeat i collect j)))
于 2012-06-26T17:38:52.437 に答える
0

基本的に、同じことを行う別の方法:

(defun change-list (x)
  (let ((index 0))
    (mapcon
     #'(lambda (y)
         (incf index)
         (let ((z (car y)))
           (unless (zerop z)
             (make-list z :initial-element index)))) x)))

しかし、学習の目的には役立つかもしれません/あなたの教授が何を期待しているかを誰が知っていますか.

于 2012-06-26T19:23:41.390 に答える