(define (real x) (car x))
(define (imag x) (cdr x))
(define (complex-sqrt x)
(define (first a b) (sqrt (/ (+ a
(sqrt (+
(* a a)
(* b b))))
2)))
(define (second a b) (sqrt (/ (+ (* -1 a)
(sqrt (+
(* a a)
(* b b))))
2)))
(cons (first (real x) (imag x)) (second (real x) (real y))))
(complex-sqrt '(2 3))
我一直收到一条错误,上面写着" *合同违规:预期数量"当它试图评估(第一个b)和(第二个b)。我不确定这些信息是否相关,但输入将始终是2个数字的列表。
答案 0 :(得分:0)
你还没有包含一个完整的例子,所以很难说出了什么问题。
也许您使用错误类型的参数调用complex-sqrt
?
这对我有用:
#lang r5rs
(define (real x) (car x))
(define (imag x) (cdr x))
(define (complex-sqrt x)
(define (first a b) (sqrt (/ (+ a
(sqrt (+
(* a a)
(* b b))))
2)))
(define (second a b) (sqrt (/ (+ (* -1 a)
(sqrt (+
(* a a)
(* b b))))
2)))
(cons (first (real x) (imag x))
(second (real x) (imag x))))
(display (complex-sqrt (cons 1 2)))
(newline)
答案 1 :(得分:0)
变化:
(define (imag x) (cdr x))
到:
(define (imag x) (second x))
(这是内置的第二个功能,而不是你的第二个功能。它等同于(car (cdr lst))
或第二个列表项。)
然后它起作用:
(complex-sqrt '(2 3))
; output: '(1.6741492280355401 . 0.895977476129838)
(cdr x)
是一个列表,而(second x)
是一个项目。
原始错误完全提到了这一点:
*: contract violation
expected: number?
given: '(3) ; <<<<<< NOTE
argument position: 1st
other arguments...:
&#39; *&#39;需要项目而不是列表功能。
另外,你不应该先使用&#39;和第二个&#39;作为您自己的函数名称,因为它们是在函数中构建的(用于获取任何列表的第一个和第二个元素)。见here。
你职能中的第二句话:
(cons (first (real x) (imag x)) (second (real x) (real y))))
应该缩进,因为它是complex-sqrt函数的一部分。 (提示:轻松地将适当的缩进应用于DrRacket中的整个代码,选择全部并按Tab键。)
(real y)
应为(imag x)