Ракетка - Учитывая два натуральных числа, возвращает список со всеми числами между a и b - PullRequest
0 голосов
/ 25 июня 2019

У меня такой вопрос: Учитывая два натуральных числа, возвращается список со всеми числами от a до b

Я пробовал это ...

 * (define (intervalo l s)(cond [(= l s)(make-list l)]
                             [(< l s)]
                             [(> l s) empty ])) *

1 Ответ

1 голос
/ 25 июня 2019

Когда вы говорите «между a и b», вы имеете в виду включение только нижней границы?включая только верхнюю границу?Или включая оба?

Давайте примем решение и рассмотрим «полуоткрытый интервал», то есть нижняя граница включена, но верхняя граница не

Сначала подумайте о том, какие данныеФункция принимает. Как говорится в вопросе - натуральные числа.Теперь сформулируем задачу в виде краткого предложения: «список чисел от l до s, включая l, но исключая s»

Некоторые примеры:

  • интервал от 0 до0 выдаст пустой список

  • интервал от 1 до 3 приведет к (список 1 2)

  • интервал от 3 до 1 равен...?Это недействительно.

[Уточнение] Необходимо добавить «допущение»: верхняя граница должна быть меньше или равна нижней границе.

;; Nat Nat -> [Listof Nat]
;; all nats in [l, s) in order
;; ASUMPTION: (<= l s)
(define (intervalo l s)
  (if (= l s) '() (cons l (intervalo (+ l 1) s))))
  • Racket уже предоставляет функцию range, которую можно использовать в качестве эталонной реализации для тестирования.

  • Для случая (> l s) может быть добавлено явное сообщение об ошибке (if будет преобразовано в cond): (raise-arguments-error 'intervalo "lower bound greater than upper bound" "lower" l "upper" s)

...