计划功能不会打印

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 = 1b = 2c = 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