收到错误::休息:需要一个非空列表;给定:()在Dr球拍中检查测试时

时间:2019-02-14 01:29:28

标签: recursion scheme racket

我正在尝试编写一个函数,以检查给定列表是否呈螺旋形增长(数字从负数到正数,而数字的abs值严格增加)

EX:

(check-expect
 (spiraling? (cons 1 (cons -10 (cons 100 empty))))
 true)

即使在哪里出错,我也不完全确定,因此我在写作中做了些微调整,没有做任何事情。

(define (spiraling? list-of-int)
  (cond
    [(empty? list-of-int) true]
    [(and (number? (first list-of-int))
          (empty? (rest list-of-int))) true] 
    [(and (< (abs (first list-of-int))
             (abs (first (rest (first list-of-int)))))
          (cond
            [(and (> 0 (first list-of-int))
                  (< 0 (first (rest (first list-of-int)))))true]
            [(and (< 0 (first list-of-int))
                  (> 0 (first (rest (first list-of-int)))))true]
            [else false]))
     (cond
       [(empty? list-of-int) true]
       [else (spiraling? (rest list-of-int))])]))



(check-expect
(spiraling? (cons 1 (cons -10 (cons 100 empty))))
true)
(check-expect
(spiraling? (cons -1 (cons 2 (cons -3 (cons 4 empty)))))
true)
(check-expect
(spiraling? (cons 99 (cons -100 (cons 100 empty))))
false)
(check-expect
(spiraling? (cons 0 (cons -10 (cons 100 empty))))
false)

但是相反,它显示为:

:: rest: expects a non-empty list; given: ()

1 个答案:

答案 0 :(得分:1)

您的程序有很多不连贯之处。

首先,函数的参数应为整数列表,但有时您将其用作列表列表,例如,在编写时:

(abs (first (rest (first list-of-int)))))

实际上(first list-of-int)应该返回一个整数(列表的第一个元素),但是随后您将其应用于rest,这是应用于非空列表的运算符,返回的列表不包含第一个元素。这就是错误消息的原因(“其余期望非空列表但收到1”。

如果要列表的第二个元素,可以执行(first (rest list)),或者最好执行(second list)。这些是该语言的基本运算符。

第二,在cond的第二个分支中,您检查列表的第一个元素是否为数字,但是即使您同时使用第一个分支,也不会在第三个分支中重复此检查。第二个要素是数字。因此,该测试无用,因为它仅在某些情况下应用于列表的某些元素。您应该套用所有元素或不套用任何元素,以保持一致。

第三步,在cond的最后一个分支的最后两行中,您再次检查列表是否为空,但是在程序的这一点上,列表肯定不为空,因为您已经测试了至少两个元素!

这是一个可能的解决方案(无需检查所有元素是否都是数字):

(define (spiraling? list-of-int)
  (if (or (empty? list-of-int) (empty? (rest list-of-int)))
      true
      (let ((first-element (first list-of-int))
            (second-element (second list-of-int)))
        (if (or (< first-element 0 second-element)
                (> first-element 0 second-element))
            (spiraling? (rest list-of-int))
            false))))