【问题标题】:Search and add to a list in Scheme在 Scheme 中搜索并添加到列表
【发布时间】:2013-07-18 04:05:44
【问题描述】:

我想在一个列表中搜索一个元素,比如这个(它是一个列表的列表)

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

当我找到想要添加的元素时。 比如搜索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

)

这是我目前所拥有的,它会找到我想要添加它的位置,但我无法添加到那个位置。

【问题讨论】:

  • 哪种编程语言?你试过什么?
  • 到目前为止我已经发布了我的代码,我只是不知道如何添加,我可以在列表中找到索引名。我想我需要在某处使用 cons 才能添加到列表中。

标签: list search scheme add


【解决方案1】:

在您在那里添加新值之后,您必须在从找到的点返回的途中重建新树。因此,您必须在您现在停止的位置上一级停止:在(name old-value ...) 而不是name。这意味着您必须测试与(car treenode) 的相等性,而不是treenode 本身。这样你就可以构建一个 new 关联组作为

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

你需要改变你的递归结构来使用这个新的更新的关联组而不是旧的,在你回来的路上重建整个树:

(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))))))) 

【讨论】:

  • 好的,我明白了,很好的解释,很有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多