首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方案中将符号添加到两个元素列表的末尾

在方案中将符号添加到两个元素列表的末尾
EN

Stack Overflow用户
提问于 2013-10-07 04:08:25
回答 2查看 114关注 0票数 0

到目前为止,我已经

代码语言:javascript
复制
(define insert-3
  (lambda (sym ls)
    (cond
      [(null? ls) '()]
      [else (cons sym (insert-3 (caadr ls)))])))

我知道caadr是错误的,因为它不存在于两个元素的列表中。但我不知道如何将符号添加到列表的末尾。

EN

回答 2

Stack Overflow用户

发布于 2013-10-07 04:36:57

假设

代码语言:javascript
复制
sym is 'c
ls  is '(a b)

那么您的结果将由

代码语言:javascript
复制
> (cons 'a (cons 'b (list 'c)))
'(a b c)

或等效的

代码语言:javascript
复制
> (cons 'a (cons 'b (cons 'c null)))
'(a b c)

因此,您的过程需要对每个元素进行cons操作,直到它消耗了ls,然后是cons (list sym)或(cons sym null):

代码语言:javascript
复制
(define insert-3 
  (lambda (sym ls) 
    (cond 
      [(null? ls) (list sym)] 
      [else       (cons (car ls) (insert-3 sym (cdr ls)))])))

这样的话

代码语言:javascript
复制
   (insert-3 'c '(a b))
=> (cons 'a (insert-3 'c '(b)))
=> (cons 'a (cons 'b (insert-3 'c '())))
=> (cons 'a (cons 'b (list 'c)))

这将适用于任何长度的列表:

代码语言:javascript
复制
> (insert-3 'c '(a b))
'(a b c)
> (insert-3 'e '(a b c d))
'(a b c d e)
票数 0
EN

Stack Overflow用户

发布于 2013-10-07 11:20:45

下面是一个非常简单的函数:

代码语言:javascript
复制
(define (insert-3 sym lst)
  (reverse (cons sym (reverse lst))))

这是另一个

代码语言:javascript
复制
(define (insert-3 sym lst)
  (assert (= 2 (length lst)))
  (let ((frst (car  lst))
        (scnd (cadr lst)))
    (list frst scnd sym)))

如果你想开始考虑递归,也要有一点效率:

代码语言:javascript
复制
(define (insert-at-end! sym lst)
  (if (null? lst)
      (list sym)
      (let looking ((l lst))
        (if (null? (cdr l))
            (begin (set-cdr! l (list sym))  ;; replace last `cdr`
                   lst)                     ;; return modified `lst`
            (looking (cdr l))))))
> (insert-at-end! 1 '(5 4 3 2))
(5 4 3 2 1)
> (insert-at-end! 1 '(2))
(2 1)
> (insert-at-end! 1 '())
(1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19213386

复制
相关文章

相似问题

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