首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向列表中添加元素

向列表中添加元素
EN

Stack Overflow用户
提问于 2017-11-06 11:14:42
回答 2查看 726关注 0票数 0

我正在尝试在Scheme中实现一个过程,该过程将在位置i处添加一个元素x到现有列表中。这是我想出来的:

代码语言:javascript
复制
(define empty-list '())
(define (add i x L)
  (cond ((null? L) (set! L (list x)))
        ((= i 0)(set! L (cons x L)))
        (else (set! L (cons (car L)
                             (add (- i 1) x (cdr L))))
      )))

(add 0 1 empty-list) -> returns ()
(add 1 2 empty-list) -> returns ()
(add 2 3 empty-list) -> returns ()

代码不会更新现有列表。但是,如果我只运行(set! empty-list (list 1))(set! empty-list (cons 2 empty-list)),它就能正常工作。我正在努力理解我做错了什么。

EN

回答 2

Stack Overflow用户

发布于 2017-11-06 18:59:46

在使用set!时,您不会更改实际值,而是为最具体的绑定分配一个新值。在JavaScript中,它的工作原理相同:

代码语言:javascript
复制
function add (arr, element) {
  arr = arr.concatenate([element]);
  return arr;
}

const test = [1, 2, 3];
add(test, 4); // => [1, 2, 3, 4]
test;         // => [1, 2, 3]

Scheme中的这类过程通常不会发生变化。如果您删除带有该值的set!,它将返回正确的值:

代码语言:javascript
复制
(define (add i x L)
  (cond 
    ((null? L) (list x)) ; might not be at correct position
    ((= i 0) (cons x L))
    (else (cons (car L) (add (- i 1) x (cdr L))))))

(add 1 'b '(a c)) ; ==> (a b c)
票数 0
EN

Stack Overflow用户

发布于 2017-11-08 10:02:20

在Scheme中,像许多函数式语言一样,我们通过使用更新的参数调用递归函数来更新状态。

代码语言:javascript
复制
(define (add i x l)
  ;; handle base cases outside of recursion, such as
  ;; if the starting list is empty, `i` is disregarded etc.
  (cond [(null? l) (cons x l)]
        [(null? (cdr l))
         (if (<= i 0)
             (cons x l)
             (append l (list x)))]
        [else
         (let recur ([start l] [index 0])
           ;; base case
           (if (= index i)
               (cons x start)
               ;; this is how states are updated
               (cons (car start) (recur (cdr start) (+ index 1)))))]))


;; > (add 3 'newguy '(mary peter nguyen joo kim))
;; '(mary peter nguyen newguy joo kim)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47129215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档