получение ошибки :: rest: ожидает непустой список;учитывая: () в др ракетке при проверке испытаний - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь написать функцию, которая проверяет, является ли данный список спиральным (числа переходят от отрицательного к положительному, в то время как абсолютное значение чисел строго увеличивается)

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 голосов
/ 14 февраля 2019

Ваша программа имеет много несоответствий.

Во-первых, аргумент функции должен быть списком целых чисел, но иногда вы используете его как список списков, например, когда пишете:

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