Здесь есть несколько проблем. Для начала не используйте list
в качестве параметра в определении процедуры; это переопределяет встроенную list
процедуру в odd
, делая ее недоступной (не то, что вам здесь нужно).
Когда car
или cdr
в списке ввода null?
, Код OP возвращает список ввода; это не правильно. Если cdr
из списка ввода пуст, то вход является списком одного элемента с четным индексом. Вместо этого верните '()
в этом случае.
Наконец, рассмотрим:
(cons (car list) (odd (cddr list)))
Это cons
- первый элемент списка ввода в результирующий список элементов с нечетным индексированием ; но первый элемент списка ввода всегда имеет четный индекс! Это связано с тем, что первый элемент исходного списка ввода имеет индекс 0, и каждый список ввода в рекурсивном вызове также начинается с элемента с четным индексом благодаря уменьшению (cddr list)
. Вместо этого код должен cons
элемент second из списка ввода (cadr
) в результирующий список элементов с нечетным индексом.
Вот исправленная версия:
(define (odd xs)
(if (or (null? xs) (null? (cdr xs)))
'()
(cons (cadr xs) (odd (cddr xs)))))
Пример взаимодействия REPL:
> (odd '())
()
> (odd '(0))
()
> (odd '(0 2))
(2)
> (odd '(0 2 3 7 5))
(2 7)