0

私はlos、数字を取り、リストのnum番目のシンボルを返す関数検索を行いました。単純

(define (search los num)
  (cond
    [(empty? los) empty]
    [(zero? num) (first los)]
    [else (lookup (rest los) (- num 1))]))

(check-expect (lookup (list 'a 'b 'c 'd) 0) 'a)

しかし、 los (シンボルのリスト) 、シンボル (s) 、および数値 (numth) を取り、 num 番目のシンボルを s に置き換えて los を返す関数を設計する方法を理解するのに苦労しています。

このような何かのように-

(change (list 'a 'b 'c 'd) 'hello 2) ;==> (list 'a 'b 'hello 'd)
(change (list 'a 'b 'c 'd) 'hi 0) ;==> (list 'hi 'b 'c 'd)
4

2 に答える 2

2

まず、リストをコピーする方法を考えてみましょう。これにはnumパラメーターは含まれません。

次に、リスト要素が 0の場合は、(コピーする代わりに) 置き換えるのと同じnum-decrementing アプローチを使用します。searchnum

于 2013-02-26T18:18:16.750 に答える
2

ここに解決策があります:

(define (change los s num)
  (cond ((null? los) '())
        ((< num 0) los)
        ((= num 0) (cons s (cdr los)))
        (else (cons (car los) (change (cdr los) s (- num 1))))))

基本的に、アイデアは再帰的にリストを再作成することですが、ひねりを加えています (n 番目の記号を s に置き換えます)。

したがって、リストを再帰的に「再作成」するには、次のことができます。

(define (lst los)
  (if (null? los)
    '()
    (cons (car los) (lst (cdr los)))))

のパラメータはchange、置換するシンボルと置換する位置を提供します。そのため、カウントダウンして、その時点までのリストを再作成します。次に、カウントダウンが 0 になったら、現在のシンボルの代わりにコンスするだけで、リスト内の現在のシンボルを新しいシンボルに置き換えることができます。< 0という理由だけでチェックを追加しました。

于 2013-02-26T18:18:42.083 に答える