如何在方案中定义最后?

时间:2010-02-17 05:48:05

标签: scheme

如何编写一个函数来获取列表的最后一个元素?

8 个答案:

答案 0 :(得分:5)

找到列表的最后一个:

(define (last l)
    (cond ((null? (cdr l)) (car l))
          (else (last (cdr l)))))

使用map最后映射到列表:

(map last '((a b) (c d) (e f)))
==> (b d f)

所以一个新功能:

(define (last-list l)
  (map last l)
  )

(last-list '((a b) (c d) (e f)))
==> (b d f)

答案 1 :(得分:4)

可能不是最有效的,但肯定是最简单的一种:

(define (last lst)
  (car (reverse lst)))

示例:

(last '(1 2 3 4)) => 4    
(last '((a b) (b c) (d e))) => (d e)

答案 2 :(得分:3)

您编写的代码 - 获取列表的最后一个元素 - 正确返回列表的最后一个元素。你有一份清单。有一个外部列表

(x y z)

,其中

x = (a b)
y = (c d)
z = (e f)

所以你得到了列表的最后一个元素z,即(e f)

您是否希望您的上一个功能有所不同?如果希望它返回最后一个嵌套列表的最后一个元素,则需要更改基本案例。现在你回车了。相反,你想检查汽车是否是一个列表,然后在那上面调用你的嵌套最后一个函数。

有意义吗?

答案 3 :(得分:1)

你的上一个功能很好,但你现在必须考虑你想用它做什么。

你有一个列表列表,你想要取最后一个列表。

所以每次都应用它来递减你的列表:

(define (answer lst)
   (cond ((null? (cdr l)) null)
         (else (cons (last (car l)) (answer (cdr lst))))

答案 4 :(得分:1)

又一种可能性:

(define (last thelist) 
    (if 
        (null? (cdr thelist)) (car thelist)
        (last (cdr thelist))))

(define (all-last lists) (map last lists))

编辑:刚看到你不知道map,并想要一个没有它的解决方案:

(define (all-last lists) 
    (if
        (null? lists) `()
        (cons (last (car lists)) (all-last (cdr lists)))))

就获取一个空列表而言,我猜你正在尝试将这个类似地图的前端与last的原始定义一起使用,而它的目的是使用last的定义。 {1}}我在上面给出了。请尝试以下定义:

(define (last thelist) (if 
                 (null? (cdr thelist)) (car thelist)
                 (last (cdr thelist))))

(define (all-last lists) (if
                      (null? lists) `()
                      (cons (last (car lists)) (all-last (cdr lists)))))

并进行快速测试:

  

(全部最后`((a b)(c d)(e f)))

结果应为:

  

(b d f)

答案 5 :(得分:0)

(define last
  (lambda (ls)
    (list-ref ls (- (length ls) 1))))

答案 6 :(得分:0)

我喜欢简短,甜蜜,快速,尾部递归的程序。

命名为让我的朋友。

这解决了原始问题,如果列表没有最后一个元素,则返回#f。

(定义(最后L)(让f((最后#f)(L L))(如果(空?L)最后(f(车辆L)(cdr L)))))

答案 7 :(得分:0)

获得所需内容的最佳方式:

(define (last lst)
  (cond [(empty? lst) empty]
        [(empty? (rest lst)) (first lst)]
        [else (last (rest lst))]))