В нашем последнем экзамене мы должны были написать процедуру, которая выяснит, можно ли записать данное число в виде суммы квадратов не равных чисел.наименьший квадрат должен быть 2 ^ 2, а не 1 ^ 2
например - данное число равно 13 -> истина, потому что 13 следует переписать как 2 ^ 2 + 3 ^ 2, если заданное число равно 8 -> ложь, потому что 8равно 2 ^ 2 + 2 ^ 2, что является суммой равных квадратов.
Я застрял на поиске правильного алгоритма.Например, мне дадут номер 65. У меня есть идея написать вспомогательную процедуру «квадраты», которая всегда находит sqr заданных чисел (начиная с 2 ^ 2) для заданных чисел или на единицу больше 65. Так, например, 65 найдет2 ^ 2 3 ^ 2 4 ^ 2 5 ^ 2 6 ^ 2 7 ^ 2 8 ^ 2 и теперь я не знаю, как проверить сумму всех комбинаций квадратов, если они дадут ответ 65. Ответ должен быть #trueпотому что 4 ^ 2 и 7 ^ 2 дадут результат 65
edit 1:
Я написал этот код.Это не дает правильных результатов (сумма-кв 17) -> true
(define (sum-sq n)
(sum-sq-help n 2))
(define (sum-sq-help n i)
(if (or (= (sqr i) (/ n 2)) (= n 0))
#f
(if (integer? (sqrt (- n (sqr i)))) #t (sum-sq-help n (+ 1 i)))))
edit 2: обновление - это работает нормально
(define (sum-sq n)
(sum-sq-help-2 n 2))
(define (sum-sq-help-2 n i)
(cond ((= (sqr i) (/ n 2)) #f)
((< n (sqr i)) #f)
((= 1 (- n (sqr i))) #f)
((integer? (sqrt (- n (sqr i)))) #t)
(else (sum-sq-help-2 n (+ 1 i)))))