Scheme - 如果列表的每个元素都是两个元素的列表,则返回T / F的函数

时间:2011-11-06 13:12:53

标签: scheme

我正在尝试编写一个返回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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

  1. 编写一个函数has-two-elements?,用于确定单个列表是否恰好包含两个元素。这应该不会太难。
  2. 编写递归函数all-have-two-elements?,确定列表的所有元素是否恰好是两个元素的列表。有两种情况需要考虑:

    • 基本情况:空列表没有没有正好两个元素的元素(因为它没有任何元素)。因此,您返回#t
    • 递归:(has-two-elements? (car l))(all-have-two-elements? (cdr l))必须都是真的。
  3. 如果你正确缩进,那就是七行代码。

答案 1 :(得分:0)

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

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