Scheme函数不会打印

时间:2017-01-25 02:48:56

标签: scheme sicp

请告诉我为什么以下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)

1 个答案:

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