Racket 迭代分解为球拍中的平方和
这个问题我已经试过好几次了,但都没能解决。我想写一个迭代过程,分解为平方和,输入一个正整数n,输出第一个整数p,这样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
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))