Напишите в схеме функцию (ракетку), чтобы она возвращала список нечетных чисел в заданном диапазоне. - PullRequest
0 голосов
/ 01 марта 2020

Вот что я написал:

(define (odd-interval low high)
  (cond
    ((and (eqv? low high) (not(eqv?(modulo high 2) 0))) high)
    ((eqv? low high) '())
    ((not(eqv? (modulo low 2) 0)) (cons low (odd-interval (+ low 1) high)))
    (else (odd-interval(+ low 1) high))
    )
  )

Вот как я называю нечетный интервал:

(odd-interval '1 '9 )

Но это вывод:

(1 3 5 7 . 9)

Может ли кто-нибудь помочь мне выяснить, откуда берется период в выводе? Его нет, если у меня есть четное число для старшего.

Например, следующий вызов для нечетного интервала:

(odd-interval '1 '8 )

вернет:

(1 3 5 7)

Ответы [ 2 ]

3 голосов
/ 01 марта 2020

Используйте соответствующие операторы сравнения

Как правило, для сравнения элементов в схеме предлагается использовать более «специализированный» оператор. Для чисел оператор равенства равен =, а не eqv?.

Проверьте ваши входные параметры

Если функция вызывается с помощью (odd-interval 3 2), Функциональные циклы навсегда. Таким образом, тест завершения должен быть (> low high) или (>= low high), а не (= low high) или (eqv? low high).

Использовать примитивные функции, если они доступны

odd? уже доступен для проверки, является ли число нечетным.

Таким образом, функция может быть переписана как:

(define (odd-interval low high)
  (cond ((> low high) '())
        ((odd? low) (cons low (odd-interval (+ low 1) high)))
        (else (odd-interval (+ low 1) high))))

Примечание: вы можете использовать >= вместо >, если диапазон исключает последний элемент, который очень часто запрашивается.

Наконец, обратите внимание, что числа являются оценочными для себя, нет необходимости заключать их в кавычки, поэтому вместо:

(odd-interval '1 '9)

обычного способ написать:

(odd-interval 1 9)
2 голосов
/ 01 марта 2020

В этом случае:

((and (eqv? low high) (not(eqv?(modulo high 2) 0))) high)

Должно иметь (list high) вместо high

В других случаях значение равно либо cons, либо '(), либо значение выражения, которое приводит к любому из них. Этот случай не является ни тем, ни другим. Его значение высоко, что число. Очевидное решение состоит в том, чтобы обернуть число в списке, чтобы другие элементы могли быть включены в этот список.

...