Печать списка всех элементов с нечетным индексом в схеме - PullRequest
0 голосов
/ 01 мая 2020

Этот код печатает четные индексы:

(define (odd list)
  (if (or (null? list) (null? (cdr list)))
      list
      (cons (car list) (odd (cddr list)))))

Когда файл запускается, мой ввод: odd '(0 2 3 7 5) и он должен вернуть (2 7), но вместо этого он возвращает (0 3 5).

Я думаю, что один из моих null? неправильно расположен, но не уверен, где!

1 Ответ

3 голосов
/ 01 мая 2020

Здесь есть несколько проблем. Для начала не используйте 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)
...