0

リストの n 番目の項目に x を追加する Lisp 関数を作成する必要があります。たとえば、 を(add 5 2 '(3 1 4 6 7))返します(3 6 4 6 7)

nthiteの選択は

(defun nthitem (n list)
  (cond ((equal n 1) (car list))
        (t (nthitem (-n 1) (cdr list)))))

リストに x を追加すると、次のようになります。

(defun addto (x list)
  (cond ((null list) nil)
        (t (cons (+ x (car list)) 
                 (addto x (cdr list))))))

しかし、私はこれら2つを一緒に組み合わせることができません。

4

4 に答える 4

1

十分に活用できていませんnreconcdoとに基づくソリューションを次に示しreconcます。アイデアは、置換する必要がある要素の位置に到達するまで、リストから要素を逆の順序で蓄積しながらリストをたどることです。次に、ビットをくっつけます。つまり、蓄積してきたリストを逆にして、新しい要素とその後の末尾から構築されたリストに追加します。

(defun add (number index list)
  (do ((head '() (list* (first tail) head))
       (tail list (rest tail))
       (index index (1- index)))
      ((zerop index)
       (nreconc head (list* (+ number (first tail))
                            (rest tail))))))
CL-USER> (add 5 2 '(3 1 4 6 7))
(3 1 9 6 7)

これらの値が時間の経過とともにどのように変化するかを確認する価値があります。より多くの数値を含む例を考えてみましょう。各反復におけるheadtail、およびの値を見てみましょう。index

CL-USER> (add 90 5 '(0 1 2 3 4 5 6 7 8 9))
(0 1 2 3 4 95 6 7 8 9)

head: ()
tail: (0 1 2 3 4 5 6 7 8 9)
index: 5

head: (0)
tail: (1 2 3 4 5 6 7 8 9)
index: 4

head: (1 0)
tail: (2 3 4 5 6 7 8 9)
index: 3

head: (2 1 0)
tail: (3 4 5 6 7 8 9)
index: 2

head: (3 2 1 0)
tail: (4 5 6 7 8 9)
index: 1

head: (4 3 2 1 0)
tail: (5 6 7 8 9)
index: 0

にたどり着いたら、 に足してと一緒にすることで、残りの最終結果0を得ることができます。つまり、number(car tail)(cdr tail)

(list* (+ (car tail) number) (cdr tail)

生産する

(95 6 7 8 9)

そして、nreconctake および get に使用し(4 3 2 1 0)ます(95 6 7 8 9)(0 1 2 3 4 95 6 7 8 9)つまり、

(nreconc (list 4 3 2 1 0) '(95 6 7 8 9))
;=> (0 1 2 3 4 95 6 7 8 9)

何らかの理由で を使用できない場合do、たとえばこれが宿題である場合でも、そのトレースはアキュムレータを使用してこれの直接再帰バージョンを作成するのに十分な情報を提供するはずです。ただし、何があっても、リストを作成(または) したり、いくつかのリストを一緒に (または、組み合わせたり、または) しreverseたりできる必要があります。nreverseappendnconcrevappendnreconc

于 2013-10-23T19:56:54.910 に答える
0

使用するsetnth

(setq a (list 3 1 4 6 7))

(defun add-number-to-nth-element (arg liste element)
  "Add ARG, a number, to nth ELEMENT of LISTE. "
  (setnth element liste (+ arg (nth element liste)))
  liste)

(add-number-to-nth-element 5 a 1) 

;; ==> (3 6 4 6 7)
;; ==> (3 11 4 6 7)
;; ==> (3 16 4 6 7)
;; ==> (3 21 4 6 7)
;; ==> (3 26 4 6 7)

;; カウント要素は0から始まります

于 2013-10-24T09:58:13.480 に答える
0

書式設定に重大な問題があり、いくつかの場所で演算子間のスペースが不足しています。Emacs や Kate など、括弧のマッチングを行うエディターを必ず使用してください。

addto機能を変更せずにこれら2つを組み合わせる方法を示すだけです

(defun addto (x n list)
  (cond ((null list) nil)
        (t (cons (+ x (car list)) 
                 (addto x (- n 1) (cdr list))))))

したがって、コードには基本ケースに加えて 2 つのケースが必要です。(= n 1)今日のデフォルトのケースである 0 ではなく 1 からカウントを開始するためcarcdr. 幸運を

于 2013-10-23T19:34:12.997 に答える
0

必要なのは次nthsetfとおりです。

emacs -Q、次に以下を評価します。

(defun add-to-nth (x n ys)
  (when ys (setf (nth n ys) (+ x (nth n ys)))))

(setq foobar  '(1 2 3 4 5))
(add-to-nth 42 1 foobar)

C-h v foobar  ; =>  (1 44 3 4 5)
于 2013-10-29T18:19:54.460 に答える