编写一个程序来测试给定数字是否为Scheme中的不同平方和

时间:2019-02-06 08:32:10

标签: algorithm sum scheme racket

在上一次考试中,我们必须编写程序来确定给定的数字是否可以写为非相等数字的平方和。 最小的平方必须是2 ^ 2,而不是1 ^ 2

例如-给定数字为13-> true,因为13被重写为2 ^ 2 + 3 ^ 2        如果给定的数字是8-> false,因为8是2 ^ 2 + 2 ^ 2,这是相等的平方和。

我一直坚持寻找正确的算法。例如,给我65。我有一个想法写一个帮助程序“ squares”,该程序总是找到给定数字(从2 ^ 2开始)的sqr到给定数字或大于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)-> 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)))))

编辑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)))))

1 个答案:

答案 0 :(得分:0)

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