Я начинаю кодировать в 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)
Если я верну ноль или '() все идет хорошо, но, очевидно, я не получаю правильный результат.
Заранее спасибо