0

数値 n が 2 つの平方の和として記述できるかどうかをテストするために、平方和関数を作成しました。私のコードは次のとおりです。

(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))     
4

2 に答える 2

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))
于 2013-09-27T15:06:43.220 に答える
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はゼロから上向きにスイープします。xyが交差すると、再帰は停止します。詳細については、私のブログをご覧ください。

于 2013-09-27T15:54:39.830 に答える