请告诉我为什么以下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)
答案 0 :(得分:1)
很明显,你的学习并没有非常注重细节。你的代码包含无数的错误,你已经允许自己将其他语言的习惯带入你的学习方案中。 DrRacket清楚地显示您的程序存在语法错误,因此这是一个很好的起点。
我加粗的部分缺少else
表达式
(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))))
))
您的代码格式错误,因此更难以查看错误的位置。
继续前进,这是另一个重大错误
((+ (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)
,上面写着“将数字5应用于数字10” - 这没有任何意义。
你也会在代码中犯同样的错误。首先尝试解决这些问题,然后更新您的问题。
ps:不要使用像sum_of_greatest_squares
这样的snake_case名称。模式通常会将其格式化为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 窗口中显示你的程序结果。但是,如果您确实要显式打印到控制台,请查看display* and print* procedures