Схема DrRacket Нарушение контракта ожидаемое количество - PullRequest
0 голосов
/ 05 января 2020

Я начинаю кодировать в Scheme, и я не хочу знать, является ли число "abundante". Число x является «abundante», если сумма его делителей больше, чем двойное число x.

Так вот мой код:

#lang scheme
(define (abundante x)
  (cond 
    ((= x 0) #f)
    ((= x 1) #f)
    ((> (apply +(divisores x)) (doble x)) #t)
    (else #f)
    )
  )


;aux functions
(define (doble x) (* x 2))

(define (divisores x)
  (cond
    ((= x 1) '(1))
    (else (cons 1 (divisores-aux x 2)))
    )
  )

(define (divisores-aux x y)
  (cond
    ((= x y) '(x))
    ((integer? (/ x y))(cons y (divisores-aux x (+ y 1))))
    (else (divisores-aux x (+ y 1)))
    )
  )

Как видите, у меня есть 3 вспомогательные функции: 1) Doble x: возврат двойного числа x 2) Divisores x: возврат делителя x 2.1) Divisores-aux xy: проверка, является ли x / y целым числом, затем идет для y + 1

Но у меня проблема, когда Divisores-aux достигает x = y. Я хочу вернуть x, потому что x его разделитель, но DrRacket печатает следующую ошибку:

+: contract violation
  expected: number?
  given: y
  argument position: 6th
  other arguments...:

И указывает, что ошибка возникла на apply +(divisores x)

Если я верну ноль или '() все идет хорошо, но, очевидно, я не получаю правильный результат.

Заранее спасибо

1 Ответ

0 голосов
/ 06 января 2020

В базовом случае divisores-aux есть ошибка:

'(x)

Вышеприведенное выражение вернет список с символом x в качестве единственного члена (чтобы понять почему, прочитайте о цитировании в документации). То, что вы хотели сказать, это то, что создает список со значением переменной x:

(list x)

Кроме того, лучше использовать remainder для проверки, если число делится на другое. Это должно исправить проблемы:

(define (divisores-aux x y)
  (cond
    ((= x y) (list x))
    ((zero? (remainder x y)) (cons y (divisores-aux x (+ y 1))))
    (else (divisores-aux x (+ y 1)))))

Теперь abundante работает как положено:

(abundante 42)
=> #t
(abundante 45)
=> #f
...