Recursion 获取错误::rest:需要一个非空列表;检查测试时,在dr racket中给出:()

Recursion 获取错误::rest:需要一个非空列表;检查测试时,在dr racket中给出:(),recursion,scheme,racket,Recursion,Scheme,Racket,我试着写一个函数,检查给定的列表是否在螺旋上升(当数字的abs值严格增加时,数字从负变为正) 例: 我甚至不能完全确定我的错误在哪里,所以我在写作中做了一些小的调整,但没有做任何事情 (define (spiraling? list-of-int) (cond [(empty? list-of-int) true] [(and (number? (first list-of-int)) (empty? (rest list-of-int))) true]

我试着写一个函数,检查给定的列表是否在螺旋上升(当数字的abs值严格增加时,数字从负变为正)

例:

我甚至不能完全确定我的错误在哪里,所以我在写作中做了一些小的调整,但没有做任何事情

(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)

你的程序有很多不连贯之处

首先,函数的参数应该是一个整数列表,但有时您会将其用作列表列表,例如,当您编写:

(abs (first (rest (first list-of-int)))))
事实上,
(int的第一个列表)
应该返回一个整数(列表的第一个元素),但随后应用于它
rest
,这是一个应用于非空列表的运算符,返回没有第一个元素的列表。这就是错误消息的原因(“rest预期为非空列表,但收到1”)

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

其次,在
条件的第二个分支中,检查列表的第一个元素是否为数字,但即使将第一个和第二个元素都用作数字,也不会在第三个分支中重复此检查。因此,测试是无用的,因为它只在某些情况下应用于列表中的某些元素。为了保持一致,您应该应用于所有或任何元素

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

下面是一个可能的解决方案(不检查所有元素是否都是数字):

(定义(螺旋形?整数列表)
(如果(或(空?整数列表)(空?(整数剩余列表)))
真的
(let((第一个元素(int的第一个列表))
(第二个元素(int的第二个列表)))
(如果(或(<第一个元素0第二个元素)
(>第一个元素0第二个元素)
(螺旋形?(整数的剩余列表))
假))
:: rest: expects a non-empty list; given: ()
(abs (first (rest (first list-of-int)))))
(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))))