【问题标题】:Scheme How to Take the first item in the List?Scheme 如何取List中的第一项?
【发布时间】:2010-12-07 11:18:24
【问题描述】:

假设我要取列表的第一项'(4 3 1) '(5 6 8)

我想要这样的东西

(first '(4 3 1) '(5 6 8))

应该把第一件东西还给我

(4 3 1) 

结果。我可以调用的方案内置函数中是否有类似的东西?

car 不起作用,因为它只返回 1 个列表中的第一项

list-ref 不起作用,原因同上,返回列表中的 1 项

我该怎么做?如果我需要自己编写第一个函数?

【问题讨论】:

    标签: list scheme


    【解决方案1】:

    您可以使用list-ref 过程从列表中获取一个元素,使用它的索引,例如:

    (let ((l '((4 3 1) (5 6 8))))
      (list-ref l 0)) ; get the element at index 0
    

    但是如果你只想要第一个元素,你可以使用car:

    (let ((l '((4 3 1) (5 6 8))))
      (car l))
    

    检查运行here的sn-p。

    【讨论】:

      【解决方案2】:

      您可以使用“。”在函数定义中接受任意数量的参数。

      (define (first . args) (car args))
      (first '(4 3 1) '(5 6 8))  ;; => (4 3 1)
      

      【讨论】:

      • 为什么不干脆做(define first car)?
      • car 只接受 1 个参数。
      【解决方案3】:

      你太努力了:

      > (define (first a b) a)    
      > (first '(1 2 3) '(4 5 6))
      (1 2 3)
      

      【讨论】:

      • 类似的东西有效,但我想我没有把我的整个问题放在这里。当其中一个没有价值传递时,它不起作用。但是谢谢,我想我明白了:)
      【解决方案4】:

      自从我使用方案以来已经有一段时间了,但是您不需要先将列表放在自己的列表中

      (first (list '(4 3 1) '(5 6 8)))

      【讨论】:

      • 不,你没有。您可以定义一个接受两个参数的函数,每个参数都可以是一个列表,然后简单地返回第一个。如果(例如)出于某种原因您想要接受任意数量的列表,并且仍然只返回其中的第一个,您可能会想要使用列表列表。
      • 好点。我假设任意数量的列表作为要求的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多