0

;; 連想リスト (al) は次のいずれかです。

;; 空または

;; (cons (list kv) alst) ここで

;; k は nat (キー) です。

;; v は文字列 (値) であり、

;; alst は連想リスト (al)

updatestring は連想リスト、数値 (findnum)、および文字列 (newstring) を受け取り、連想リストに findnum と同じ数値が存在する場合、リスト内の文字列を newstring に置き換えます。

(check-expect(updatestring empty 3 "hi") (list (list 3 "hi")))
(check-expect(updatestring (list (list 1 "hi")(list 5 "wow")) 5 "new")(list (list 1 "hi")(list 5 "new")))
(check-expect(updatestring (list (list 1 "hi")(list 5 "wow")) 2 "nice")(list (list 2 "nice") (list 1 "hi")(list 5 "wow")))

これが私が持っているものであるため、コードに問題があります。

(define (al-update alst akey avalue)
 (cond
  [(empty? alst) (list (list akey avalue))]
  [(= (first(first alst)) akey) (al-update (rest alst) akey avalue)]
  [else (list(list akey avalue alst))]))

問題は、私のコードが返されることです

(list (list 5 "new" (list (list 1 "hi") (list 5 "wow"))) instead of (list (list 1 "hi") (list 5 "new"))

(list(list 2 "nice" (list (list 1 "hi") (list 5 "wow")))) instead of (list (list 2 "nice") (list 1 "hi")(list 5 "wow")))

ヒントや回答をいただければ幸いです。

4

2 に答える 2

1

再帰構造は次のようにする必要があります。

(define (al-update alist akey avalue)
  (if (empty? alist)                                 ; base, end recusion
      '()
       (cons (let ((key+value (first alist)))        ; element, one-by-one
               (if (= ...)
                    ...
                    ...))
             (al-update (rest alist) akey avalue)))) ; recursion

あなたのコードには多くの問題があります。このelse句は、リストの残りの部分を再帰する必要があります。句では=、置換と再帰を行う必要があります。上記のコードでは、再帰する 2 つの句を組み合わせました。

于 2013-03-18T23:01:19.837 に答える
0

「連想リストにfindnumと同じ番号がある場合、リスト内の文字列をnewstringに置き換える」と書かれていますが、あなたの例では、指定された番号が存在しない場合はそれをリストに追加します。

(check-expect (updatestring (list (list 1 "hi") (list 5 "wow")) 2 "nice")
              (list (list 2 "nice") (list 1 "hi") (list 5 "wow")))
(check-expect(updatestring empty 3 "hi") (list (list 3 "hi")))

コードと例 (テスト) は次のようになります。

(define (al-update alst akey avalue)
 (cond
  [(empty? alst) empty]
  [(= (first (first alst)) akey) (cons (list (first (first alst)) avalue)
                                       (al-update (rest alst) akey avalue))]
  [else (cons (first alst) (al-update (rest alst) akey avalue))]))


(check-expect (updatestring empty 3 "hi") empty)
(check-expect (updatestring (list (list 1 "hi") (list 5 "wow")) 5 "new")
              (list (list 1 "hi") (list 5 "new")))
(check-expect (updatestring (list (list 1 "hi") (list 5 "wow")) 2 "nice")
              (list (list 1 "hi") (list 5 "wow")))
(check-expect (updatestring (list (list 1 "hi") (list 5 "wow") (list 2 "bad")) 2 "nice")
              (list (list 1 "hi") (list 5 "wow") (list 2 "nice")))

ちなみに「car」は「first」、「cdr」は「rest」に相当します。

于 2013-05-14T19:20:53.833 に答える