方案平方和测试

时间:2013-09-27 15:03:44

标签: testing scheme sum

我写了一个平方和函数来测试一个数字n是否可以写成两个平方的总和。我的代码如下:

(define (square x) (* x x))
(define (sum-of-squares n)
 (define (sum-of-squares-h k)
    (cond ((= k n) #f)
       ((= n (+ (square(floor(sqrt k)))(square(floor(sqrt(- n k))))))#t)
                (sum-of-squares-h (+ k 1))))
    (sum-of-squares-h 1))    

当我测试诸如以下内容时:

(sum-of-squares 1)
(sum-of-squares 2)
(sum-of-squares 4)
(sum-of-squares 8)
(sum-of-squares 10)

我的输出是:

#f
#t
2
2
#t

我哪里出错了/我该怎么做才能解决这个问题?我已经看到了解决这个问题的其他方法,但是如果有人可以通过使用我已经拥有的东西来帮助我,这将是很棒的。我对地板功能不太熟悉,所以我可能错误地使用了它。

编辑 - 带有一些调整的代码

 (define (square x) (* x x))
  (define (sum-of-squares n)
   (define (sum-of-squares-h k)
     (cond ((= k n) #f)
           ((< n 4) #f)
           ((= n (+ (square(floor(sqrt k)))(square(floor(sqrt(- n k))))))#t)
                 (sum-of-squares-h (+ k 1))))
     (sum-of-squares-h 1))     

2 个答案:

答案 0 :(得分:4)

您忘记了最后一个条件中的else部分:

(define (sum-of-squares n)
  (define (sum-of-squares-h k)
    (cond ((= k n)
           #f)
          ((= n (+ (square (floor (sqrt k)))
                   (square (floor (sqrt (- n k))))))
           #t)
          (else
           (sum-of-squares-h (+ k 1)))))
  (sum-of-squares-h 1))

答案 1 :(得分:0)

这是我的函数,它找到一个数字 n 可以写成平方和的所有方法:

(define (squares n)
  (let loop ((x (isqrt n)) (y 0) (zs '()))
    (cond ((< x y) zs)
          ((< (+ (* x x) (* y y)) n) (loop x (+ y 1) zs))
          ((< n (+ (* x x) (* y y))) (loop (- x 1) y zs))
          (else (loop (- x 1) (+ y 1) (cons (list x y) zs))))))

算法来自Dijkstra: x n 的平方根向下扫描,而 y 从零向上扫描;当 x y 交叉时,递归停止。您可以在my blog了解更多相关信息。