在上一次考试中,我们必须编写程序,找出给定的数字是否可以写成非等号的平方和。
最小的正方形必须是2^2,而不是1^2
例如,-给定的数字是13->真,因为13被重写为2^2+3^2
如果给定的数字是8->假,因为8是2^2+2^2,这是相等平方和。
我在寻找正确的算法上吃力了例如,我将得到65号。我想写一个帮助程序“squares”,它总是找到给定数字的sqr(从2^2开始)到给定数字的sqr或大于65的sqr。例如65,它会找到2^2 3^2 4^2 5^2 6^2 7^2 8^2,现在我不知道如何测试所有平方组合的和,如果它们给出答案65。答案应该是正确的,因为4^2和7^2将给出结果65
编辑1:
我写了这段代码它没有给出正确的结果
(平方和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)))))

最佳答案

Input: n
Output: Is n a sum of squares?

Algorithm:
1.  xs := {i^2 | 1<i^2<n}
2.  x  := n
3.  loop
      if  x<=1     then return false as the final result
      if  x in xs  then return true  as the final result
      x := x - (largest number in xs smaller than x)
    endloop

10-06 12:08