【发布时间】:2019-02-06 08:32:09
【问题描述】:
在我们上次的考试中,我们必须编写程序来确定给定的数字是否可以写成不相等数字的平方和。 最小的正方形必须是 2^2,而不是 1^2
例如- 给定数字是 13 -> true 因为 13 被重写为 2^2 + 3^2 如果给定的数字是 8 -> false,因为 8 是 2^2 + 2^2,这是等平方和。
我一直在寻找正确的算法。例如,我将得到数字 65。我有一个想法来编写帮助程序“squares”,它总是找到给定数字的 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
编辑 1:
我已经写了这段代码。它没有给出正确的结果 (sum-sq 17) -> 真
(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)))))
编辑 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)))))
【问题讨论】:
-
从数字中减去连续的平方,然后检查这是否是不同的完美平方。因此,当您减去 65-4^2 时,您会得到 49,即 7^2。
-
继续尝试不同的 n 直到 n^2 是给定数字的一半。
-
@Barmar 我用一个例子编辑了描述。 - 当我调用 (sum-of.square-numbers 8) 时,它将运行到无限递归:/
标签: algorithm sum scheme racket