2017-11-26 9 views
0

私はすでにこの問題を複数回試みましたが、それを正しく理解することはできませんでした。正の整数nを入力し、p^2 + q^2 = nq^2 = (n - p^2)pでもn - p^2も1ではない最初の整数pを出力する反復手続きを書くことができます。このようなpが存在しない場合、関数はnを返さなければなりません。 サンプル出力は(dss 65)で、4を返します。ラケットの反復分解 - 二乗和として

これまでのコードです。

(define (dss n) 
    (define (sum-of-squares n) 
    (if (zero? n) 0 
     (cons (expt n 2) 
       (sum-of-squares (- n 1))))) 
    (sum-of-squares 1)) 

私が手出力は明らかに間違っている

(dss 65) ; (1 . 0) 

です。助けてください!

答えて

0

リストは、この問題とは何の関係もない、解決策は、定義から、次のとおりです。あなたは2から始まるすべてのpの値をテストし、私たちは式p^2 + q^2 = nを満たす整数q1より大きいを見つけることができるかどうかを確認する必要があります。次のようなもの:

(define (dss n) 
    (define (sum-of-squares p) 
    (cond ((>= p n) n) 
      ((let ((q (sqrt (- n (sqr p))))) 
      (and (integer? q) (not (= q 1)))) 
      p) 
      (else (sum-of-squares (add1 p))))) 
    (sum-of-squares 2)) 

(dss 65) 
=> 4 
+0

この部分にはsqrtを意味しますか(sqr p)。また、私がテストしたとき(dss 65)、結果は65ではなく4です。 – cschang

+0

いいえ、私は 'sqr'を意味しました。これはラケットに組み込まれた' square'プロシージャです: '(lambda(x)(* x x))'あなたは何かを変えましたか?私のマシン上で動作するので... –

+0

sqr:sqr:undefinedを使用するとエラーが発生します。 は未定義の識別子を参照できません。私は正方形の手続きを書く必要がありますか? – cschang

関連する問題