【问题标题】:Write a procedure which tests if given number is a sum of different squares in Scheme编写一个程序来测试给定的数字是否是 Scheme 中不同平方的和
【发布时间】: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


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多