2013-09-27 18 views
0

我寫了一個平方和函數來測試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))  
+0

我不熟悉你用來確定一個數字是否是兩個平方和的公式,你可以發佈一個鏈接到源代碼嗎? –

+0

我沒有鏈接...我的邏輯可能有缺陷。當平方和-h返回true時,如何返回「k」和「(-n k)」以查看我是否獲得了正確的值? –

+0

在代碼中,在返回'#t'之前的確切點放置一個'(display(list k( - n k)))',這樣你就可以檢查結果。或者使用調試器;) –

回答

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)) 
0

這裏是我的函數中找出所有的方式,一些ñ可以寫成正方形的總和:

(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的平方根開始向下掃動,而,而從零向上掃動;當xy交叉時,遞歸停止。你可以在my blog閱讀更多關於它的信息。