在列表中显示元素的最后一次出现

时间:2016-03-11 16:05:48

标签: scheme racket

我想显示给定列表中元素的最后一个外观。例如:对于列表'(1 1 2 1 3 3 4 3 5 6),结果将是'(2 1 4 3 5 6)
    这是我的代码:

  (define (func L res)
     (if (not (null? L))
         (foldl (lambda (e) 
                    (if (not (member e (cdr L))) 
                        (cons e (remove-duplicates-right (cdr L)))
                        (remove-duplicates-right (cdr L))))
                res L)
         res))


  (define (show-last-app L)
      (func L '()))

发生下一个错误:“foldl:给定的过程不接受2个参数”

这是我通过递归解决它的方法但我只想使用foldl或filter而不使用带副作用的函数:

(define (show-last-app L)
  (cond
    ((null? L)
      '())
    ((not (member (car L) (cdr L)))
      (append (list (car L)) (show-last-app (cdr L))))
    (else (show-last-app (cdr L)))))

1 个答案:

答案 0 :(得分:4)

我认为你误解了折叠在Scheme中是如何工作的。这更接近你的目标:

(define (show-last-app L)
  (foldr (lambda (e acc)
           (if (not (member e acc))
               (cons e acc)
               acc))
         '()
         L))

如果你真的,真的必须使用foldl

(define (show-last-app L)
  (foldl (lambda (e acc)
           (if (not (member e acc))
               (cons e acc)
               acc))
         '()
         (reverse L)))

无论哪种方式,它都按预期工作:

(show-last-app '(1 2 4 1 5 3 1 6 2))
=>  (4 5 3 1 6 2)