# 问scheme怎么实现迭代版的map

``````(define (map p l)
(if (null? l)
nil
(cons (p (car l))
(map p (cdr l)))))
``````

scheme好像没有把原子插入列表尾部的操作，只能插入到前面，有没有迭代版的map？？

``````(append '(a b c) (list 'd)) ;; (a b c d)
``````

Scheme 沒有迭代。想要 "迭代“ 也得先实现 map 类似的东西

`map` 哪来的尾递归实現？你怕不是以为所有递归都能写成尾递归？

``````(define (map-iter p l)
(define (iter li result)
(if (null? li)
(reverse result)
(iter (cdr li) (cons (p (car li)) result))))
(iter l '()))
``````
1 个赞

`data List a = Nil | List a ` 这是lisp的list，是哪门子的双链表？

@zhouchongzxc

``````(define (map-one p l)
(let ((aux (lambda (aux head tail l)
(begin (setcdr tail (p (car l)))
(aux aux head (cdr tail) (cdr l)))))))
(when (pair? l)
(let ((head (cons (p (car l)) nil)))
``````

cdr 是 (nth 1) 不是尾部

1 个赞

``````data List a = Nil | Cons a (List a)
``````

@glgl-schemer 稍微修正下：

``````(define (map-one p l)
(let ((aux (lambda (aux head tail l)
(begin (setcdr tail (cons (p (car l)) nil))
(aux aux head (cdr tail) (cdr l)))))))
(when (pair? l)
(let ((head (cons (p (car l)) nil)))
``````

``````(define (map-set p l)
(define (iter li)
(cond ((null? li) l)
(else
(set-car! li (p (car li)))
(iter (cdr li)))))
(iter l))
``````