Racket 迭代分解为球拍中的平方和

Racket 迭代分解为球拍中的平方和,racket,Racket,这个问题我已经试过好几次了,但都没能解决。我想写一个迭代过程,分解为平方和,输入一个正整数n,输出第一个整数p,这样p^2+q^2=n,其中q^2=(n-p^2),并且p和n-p^2都不是1。如果这样的p不存在,函数应该返回n。 示例输出为(dss 65)返回4 这是到目前为止我的代码 (define (dss n) (define (sum-of-squares n) (if (zero? n) 0 (cons (expt n 2) (s

这个问题我已经试过好几次了,但都没能解决。我想写一个迭代过程,分解为平方和,输入一个正整数n,输出第一个整数p,这样
p^2+q^2=n
,其中
q^2=(n-p^2)
,并且
p
n-p^2
都不是1。如果这样的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)

这显然是错误的。请帮忙

列表与此问题无关,解决方案来自定义:您必须测试从
2
开始的所有
p
值,看看我们是否可以找到一个大于
1
的整数
p^2+q^2=n
。大概是这样的:

(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

列表与此问题无关,解决方案来自定义:您必须测试从
2
开始的所有
p
值,看看是否可以找到一个大于
1
的整数
p^2+q^2=n
。大概是这样的:

(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

你是说这个零件的sqrt:(sqr p)。另外,当我测试(dss 65)时,结果是65而不是4。不,我的意思是
sqr
——这是内置于球拍中的
square
程序:
(λ(x)(*x))
。你有什么改变吗?因为它在我的机器上工作…当我使用sqr:sqr:undefined时出现错误;无法引用未定义的标识符。那我必须写一个正方形程序吗?这是因为你使用的语言。然后定义它,它很简单:
(define(sqrx)(*xx))
你是说这部分的sqrt:(sqrp)。另外,当我测试(dss 65)时,结果是65而不是4。不,我的意思是
sqr
——这是内置于球拍中的
square
程序:
(λ(x)(*x))
。你有什么改变吗?因为它在我的机器上工作…当我使用sqr:sqr:undefined时出现错误;无法引用未定义的标识符。那我必须写一个正方形程序吗?这是因为你使用的语言。然后定义它,它很简单:
(定义(sqrx)(*x))