1

このようなリスト内の要素を検索したい(リストのリストです)

(name1 (name2 (name3 name4) (name5 (name6))) (name7 (name8 name9)) (name10 (name11 name12)) (name13))

その要素を見つけたら、それに追加したいと思います。を検索して、 andグループname10に新しい名前を追加します。どんな助けでも大歓迎です!name11name12

(define (adder name2badded indexname treenode)
  (display treenode)
  (newline)
      (cond
        ((null? treenode)#f) ;"Tree is null"))
        ((pair? treenode)
           (if (adder name2badded indexname (car treenode))
             (display "Gotcha!")
           (adder name2badded indexname (cdr treenode))
       )
    ) ;END pair?
    (else
      (eq? indexname treenode)
    );END else
  );END Cond

)

これは私がこれまでに持っているもので、追加したい場所を見つけますが、その場所に追加することはできません.

4

1 に答える 1

1

そこに新しい値を追加した後、見つかったポイントから戻る途中で新しいツリーを再構築する必要があります。したがって、現在停止している場所の 1 つ上のレベルで停止する必要があります: at(name old-value ...)ではなく atnameです。(car treenode)これは、それ自体ではなく、との等価性をテストする必要があることを意味しますtreenodeこのようにして、新しい関連グループを次のように構築できます。

(cons (car treenode) (cons val2add (cdr treenode)))

また、再帰構造を変更して、古いものではなくこの新しい更新された assoc グループを使用して、帰りにツリー全体を再構築する必要があります。

(define (add-into val2add name tree)
  (if (pair? tree)
    (if (eqv? name (car tree))
      (cons name (cons val2add (cdr tree)))      ; found!
      (cons (add-into val2add name (car tree))   ; it's in CAR or in CDR,
            (add-into val2add name (cdr tree)))) ;   or maybe in both?
    tree))

しかし、ツリーが実際に連想リストであり、外科的ルーチンの使用が許可されている場合は、次のように使用できます。

(define (add-into! val2add name als) 
  (cond ((assv name als) => 
           (lambda (a)
            (set-cdr! a (cons val2add (cdr a))))))) 
于 2013-07-18T06:55:27.260 に答える