【问题标题】:Scheme - A function that returns T/F if each element of a list is a list of two elementsScheme - 如果列表的每个元素都是两个元素的列表,则返回 T/F 的函数
【发布时间】:2011-11-06 13:12:53
【问题描述】:

我正在尝试编写一个函数,该函数返回关于列表是否包含列表元素的 T/F,这些元素恰好是两个可以是任何表达式的元素。我对 Scheme 很陌生,并且一直被困在如何确定如何去做这件事上。我已经尝试过使用 if、cond 和 lambda 的所有方法,但都没有成功。似乎我无法弄清楚如何让 Scheme 遍历整个列表并在最后返回它是否是 T/F。

我正在寻找的一些示例:

(foobar? '((a 1)(b 2)))
#t
(foobar? '((foo 100)(bar 2 3)))
#f
(foobar? '((a 1) b (c 3)))
#f
(foobar? '((a 1) . 2))
#f

任何帮助将不胜感激。

【问题讨论】:

    标签: scheme


    【解决方案1】:
    1. 编写一个函数has-two-elements?,确定一个列表是否正好有两个元素。这应该不会太难。
    2. 编写一个递归函数all-have-two-elements?,它确定列表的所有元素是否都是正好两个元素的列表。有两种情况需要考虑:

      • 基本情况:一个空列表没有不包含两个元素的元素(因为它没有任何元素)。所以,你返回#t
      • 递归:(has-two-elements? (car l))(all-have-two-elements? (cdr l)) 必须都为真。

    如果你正确缩进,那是七行代码。

    【讨论】:

    • 那么就按照你目前所说的进行吧(我会继续更新,因为我弄清楚了):(define (check-length? l) (if (eq? (length l) 2) #t #f))
    • (define (all-have-two-elements? l) (if (null? l) #t) ;; recursion 不确定我是否理解您如何描述如何执行递归部分。如果基本情况为空列表返回 true,那么您希望我为列表的第一个元素调用 has-two-elements?
    • @user1032208:首先观察(if (eq? (length l) 2) #t #f) 等价于(eq? (length l) 2)。至于递归,请在教科书中的列表中查找递归函数的示例并研究它的结构,也许复制它的骨架。你越来越近了。
    • @user1032208:哦,请使用= 而不是eq? 来实现数值相等。
    • 感谢您到目前为止的帮助。这是我经过更多挑选后得到的:(define (has-two-elements? l) ((= (length l) 2)))(define ((all-have-two-elements? l) (cond ((null? l)) ((and(check-length? (car l)) (zipper? (cdr l)))) (else #f) ) ) 我开始测试用例,它似乎工作正常,直到我通过这样的列表: ((a 1) b (c 3)) 其中它抱怨 b 不是“正确的列表”。有关如何解决此问题的任何想法?
    【解决方案2】:

    我的方案有点生疏,但似乎解决以下问题才是你真正需要做的:给定一些东西,如果它是一个列表,则返回它的长度,否则为零。获取列表的长度很容易:如果为空,则为零;否则,1 + 尾巴长度。检查事物是否是一个列表也应该是可能的。调用执行此 LengthIfList 的函数。

    现在,您的解决方案是:如果头部的 LengthOfList 为 2 并且应用于尾部的函数返回 true 或列表为空,则返回 true,否则返回 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多