subterm と replace の 2 つの関数を実装しようとしています。
- subterm は引数として 2 つのリストを取り、2 番目のリストを使い果たした後に到達した最初のリストの要素を出力します。
たとえば、
(subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(4 2 2 1))
戻るべき
8
リストのn番目の要素を出力する次の関数を思いつきました:
(define (subterm list n)
(cond
((null? list) '())
((= n 1) (car list))
(else (subterm (cdr list) (- n 1)))))
- replace は 3 つのリストを取り、到達した値をリストの残りの部分を変更せずに置き換えた結果を返します。
たとえば、次のように呼び出します。
(replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(11 12) '(4 2 2 1))
返す必要があります:
'(1 2 (3 4 5) (6 (7 ((11 12)) 9 10)))
繰り返しますが、最初のリストの n 番目の要素を 2 番目のリストに置き換え、最初のリストの残りの部分を変更しないこのコードを思いつきました。
#lang racket
(define (replace list elem n)
(cond
((empty? list) empty)
((eq? n 1) (cons elem (cdr list)))
(#t (cons (car list) (replace (cdr list) elem (- n 1))))))
これらの関数を変更して 2 つのリストを取得するにはどうすればよいですか?
編集 1: いくつかの例:
> (subterm '(1 2 3 4 5) '(3))
3
> (subterm '(1 2 3 4 5) '(2))
2
> (subterm '(1 2 (3 4 5) 6 7) '(3 2))
4
次の例を検討してください。
> (subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(4 2 2 1))
8
上記の例では、subterm は 2 つのリストを取ります。次に、2 番目のリストを読み取ります。2 番目のリストは基本的に、4 番目の要素 (6 (7 (8) 9 10)最初のリスト (1 2 (3 4 5) (6 (7 (8) 9 10)))。
> (subterm '1 '())
1
> (subterm '(1 2 (3 4 5) (6 (7 (8) 9 10))) '())
'(1 2 (3 4 5) (6 (7 (8) 9 10)))
> (replace '(1 2 3 4 5) '(6 7 8) '(3))
'(1 2 (6 7 8) 4 5)
> (replace '(1 2 3 4 5) '(6 7 8) '(2))
'(1 (6 7 8) 3 4 5)
次の例を検討してください。
> (replace '(1 2 (3 4 5) 6 7) '(8 9) '(3 2))
'(1 2 (3 (8 9) 5) 6 7)
replace は 3 つのリストを受け取ります。最初のリストは、要素を置換する必要があるリストです。2 番目のリストには、最初のリストに追加する必要がある新しい要素が含まれています。3 番目のリストには、要素を置換する必要がある位置が含まれています。したがって、基本的には、最初のリスト (1 2 (3 4 5) 6 7) の 3 番目の要素 (3 4 5) の 2 番目の要素 (4) を置き換えました。
> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) '(11 12) '(4 2 2 1))
'(1 2 (3 4 5) (6 (7 ((11 12)) 9 10)))
> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) 1000 '(4 2 2 1))
'(1 2 (3 4 5) (6 (7 (1000) 9 10)))
> (replace '(1 2 (3 4 5) (6 (7 (8) 9 10))) 'x '())
'x
> (replace '1 '(2 3 4) '())
'(2 3 4)