2

subterm と replace の 2 つの関数を実装しようとしています。

  1. 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)))))
  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)
4

3 に答える 3

1

まず、subterm2 つの異なる関数の名前を使用しています。のコード例を提供したバージョンを呼び出して、 1 ではなく = 0list-ref(car list)場合に発生させましょう。n

(define (list-ref list n)                   
  (cond 
    ((null? list) '())             
    ((= n 0) (car list))              
    (else (list-ref (cdr list) (- n 1)))))

結局のところ、list-refは既にracketライブラリにあるため、最初から実装する必要はありません。したがって、それを使用すると、あなたsubtermは簡単です:

(define (subterm main-list path)
   (match path
     ('() #f)
     ((list n) (list-ref main-list (sub1 n)))
     ((cons n rest) (subterm (list-ref main-list (sub1 n)) rest))))
于 2015-04-07T04:31:49.833 に答える
0

わかりました、私はあなたのプログラミング言語のクラスにいますが、この課題は明日期限切れであることを知っているので、あまり助けたり答えたりしたくありません. まだ悩んでいる方がいらっしゃるようでしたら、少しでも参考になれば幸いです。次のヒントは、置換機能に関するものです。

まず、ベースケースが必要です。これには次のものが与えられます

(置換 '(1 2 (3 4 5) (6 (7 (8) 9 10))) 'x '()) 'x

(置換 '1 '(2 3 4) '()) '(2 3 4)

これを行うには、空のリストをチェックする条件ステートメントが必要です。最後の引数が空のリストの場合、最後から 2 番目の引数を「返す」必要があることは明らかです。(あなたのコードでは、これは "elem" と "n" になります)

ここからが難しい部分です。スキーム/ラケットに組み込まれている機能の数を理解すると、それは非常に簡単です。これが私が使用した唯一のものですが、問題の解決がはるかに簡単になりました。

(append) (list) (take) (drop) (list-ref) //これは何よりも便利です。

提出期限が過ぎたら、ソリューションを投稿します。これが役に立ったことを願っています。

編集: この割り当ての期限は数分だったので、不正行為とは見なされないと思うので、解決策を投稿します。

ラングラケット

(define (subterm term1 lat)
  (cond
    [(eqv? lat '()) term1]
    [(eqv? (car lat)1) (subterm (car term1) (cdr lat))]
    [else (subterm (cdr term1) (cons(-(car lat)1)(cdr lat)))])
  )

(define (replace term1 term2 lat)
  (cond
    [(eqv? lat '()) term2]
    [else (append(take term1 (-(car lat)1)) (list(replace (list-ref term1 (-(car lat)1)) term2 (cdr lat))) (drop term1 (car lat)))]))

</p>

それらは両方の機能です。

于 2015-04-09T02:18:36.913 に答える