计划功能不会打印
Scheme function won't print
请告诉我为什么下面的 Scheme 函数不会打印结果。我正在使用 DrRacket。
#lang sicp
(define (sqr x) (* x x))
(define (sum_of_greatest_squares a b c)
(if(> a b)
(if(> a c)
(if(> b c)
((+ (sqr a) (sqr c))(+ (sqr a) (sqr b))))
(+ (sqr a) (sqr c))
)
(if(> b c)
(if (> a c)
((+ (sqr a) (sqr b))(+ (sqr b) (sqr c)))
(+ (sqr c) (sqr b))))
))
(sum_of_greatest_squares 3 4 5)
很明显,您的学习 detail-oriented 不是很好。您的代码包含无数错误,并且您允许自己将其他语言的习惯带入您的方案学习中。 DrRacket 清楚地显示您的程序存在语法错误,因此这是一个很好的起点。
我加粗的部分缺少 else
表达式
(define (sum_of_greatest_squares a b c)
(if(> a b)
(if(> a c)
<b>(if(> b c)
((+ (sqr a) (sqr c))(+ (sqr a) (sqr b))))</b>
(+ (sqr a) (sqr c))
)
(if(> b c)
<b>(if (> a c)
((+ (sqr a) (sqr b))(+ (sqr b) (sqr c)))</b>
(+ (sqr c) (sqr b))))
))
您的代码格式不正确,因此更难找出错误所在。
继续前进,这是另一个大错误
((+ (sqr a) (sqr c))(+ (sqr a) (sqr b)))
您不能像在某些语言中那样,随心所欲地放置 ()
。 ()
用于Lisp/Scheme/Racket中的程序应用。
说 a = 1
、b = 2
和 c = 3
,上面的行相当于
((+ (sqr 1) (sqr 3))(+ (sqr 1) (sqr 2)))
((+ 1 9 )(+ 1 4 ))
(10 5)
最后一行是 (10 5)
,上面写着 "apply the number 5 to the number 10" – 这毫无意义。
你后面的代码也犯了同样的错误。先尝试解决这些问题,然后更新您的问题。
ps:不要使用 snake_case 名称,如 sum_of_greatest_squares
。计划者通常会将其格式化为 sum-of-greatest-squares
.
目前尚不清楚您的程序应该做什么。我的 猜测 是它应该对两个最大的输入进行平方然后求和。
你 可以 做一个巨大的 if
表达式层次结构来决定用哪两个参数执行计算......但另一种方法是始终使用相同的两个参数来计算结果,但使用 if
表达式将适当的参数移动到正确的位置。
将此视为您程序的横向替代方案
(define (sqr x) (* x x))
(define (sum-of-greatest-squares a b c)
(cond ((< a b) (sum-of-greatest-squares b c a))
((< b c) (sum-of-greatest-squares a c b))
(else (+ (sqr a) (sqr b)))))
这将始终对两个最大数的平方求和,但这样做的方式更加简洁
最后,Jörg 提到您实际上并没有在任何地方打印任何东西。我知道你的意思是暗示 DrRacket 没有在 Interactions window 中显示你的程序的结果。但是,如果您确实想明确打印到控制台,请查看 display* and print* procedures
请告诉我为什么下面的 Scheme 函数不会打印结果。我正在使用 DrRacket。
#lang sicp
(define (sqr x) (* x x))
(define (sum_of_greatest_squares a b c)
(if(> a b)
(if(> a c)
(if(> b c)
((+ (sqr a) (sqr c))(+ (sqr a) (sqr b))))
(+ (sqr a) (sqr c))
)
(if(> b c)
(if (> a c)
((+ (sqr a) (sqr b))(+ (sqr b) (sqr c)))
(+ (sqr c) (sqr b))))
))
(sum_of_greatest_squares 3 4 5)
很明显,您的学习 detail-oriented 不是很好。您的代码包含无数错误,并且您允许自己将其他语言的习惯带入您的方案学习中。 DrRacket 清楚地显示您的程序存在语法错误,因此这是一个很好的起点。
我加粗的部分缺少 else
表达式
(define (sum_of_greatest_squares a b c)
(if(> a b)
(if(> a c)
<b>(if(> b c)
((+ (sqr a) (sqr c))(+ (sqr a) (sqr b))))</b>
(+ (sqr a) (sqr c))
)
(if(> b c)
<b>(if (> a c)
((+ (sqr a) (sqr b))(+ (sqr b) (sqr c)))</b>
(+ (sqr c) (sqr b))))
))
您的代码格式不正确,因此更难找出错误所在。
继续前进,这是另一个大错误
((+ (sqr a) (sqr c))(+ (sqr a) (sqr b)))
您不能像在某些语言中那样,随心所欲地放置 ()
。 ()
用于Lisp/Scheme/Racket中的程序应用。
说 a = 1
、b = 2
和 c = 3
,上面的行相当于
((+ (sqr 1) (sqr 3))(+ (sqr 1) (sqr 2)))
((+ 1 9 )(+ 1 4 ))
(10 5)
最后一行是 (10 5)
,上面写着 "apply the number 5 to the number 10" – 这毫无意义。
你后面的代码也犯了同样的错误。先尝试解决这些问题,然后更新您的问题。
ps:不要使用 snake_case 名称,如 sum_of_greatest_squares
。计划者通常会将其格式化为 sum-of-greatest-squares
.
目前尚不清楚您的程序应该做什么。我的 猜测 是它应该对两个最大的输入进行平方然后求和。
你 可以 做一个巨大的 if
表达式层次结构来决定用哪两个参数执行计算......但另一种方法是始终使用相同的两个参数来计算结果,但使用 if
表达式将适当的参数移动到正确的位置。
将此视为您程序的横向替代方案
(define (sqr x) (* x x))
(define (sum-of-greatest-squares a b c)
(cond ((< a b) (sum-of-greatest-squares b c a))
((< b c) (sum-of-greatest-squares a c b))
(else (+ (sqr a) (sqr b)))))
这将始终对两个最大数的平方求和,但这样做的方式更加简洁
最后,Jörg 提到您实际上并没有在任何地方打印任何东西。我知道你的意思是暗示 DrRacket 没有在 Interactions window 中显示你的程序的结果。但是,如果您确实想明确打印到控制台,请查看 display* and print* procedures