2017-01-25 58 views
-1

请告诉我为什么下面的Scheme函数不会打印结果。我正在使用DrRacket。Scheme函数不会打印

#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

http://stackoverflow.com/help/mcve – naomik

回答

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 = 2,并且c = 3,上面的线将是

((+ (sqr 1) (sqr 3))(+ (sqr 1) (sqr 2))) 
((+ 1  9  )(+ 1  4  )) 
(10         5) 

最后一行是(10 5)它说“申请人数5至10号相当于” - 这是没有意义的。

你在代码中也会犯同样的错误。尝试先解决这些问题,然后更新您的问题。

ps:不要使用snake_case名称,如sum_of_greatest_squares。 Schemers通常会将其格式设置为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))))) 

这将始终两者之和最大的数字的平方,但在一个更清洁的方式这样做


最后,约尔格提到你实际上没有在任何地方打印任何东西。我知道你的意思是暗示DrRacket没有在Interactions窗口中显示你的程序的结果。但是,如果你想明确地打印到控制台,看看display* and print* procedures

+0

不管怎样,你的问题在技术上根本不准上是因为它有明显的语法错误。我甚至都试图回答它。 – naomik

+0

谢谢。由于括号不起作用。这就是我想要的。 #lang SiC颗粒 (定义(SQR X)(* XX)) (定义(加总最大平方ABC) (如果(> AB) (如果(> AC) (如果(> BC ) (+(SQR一)(SQR b)) (+(SQR一)(SQR C)) ) (+(SQR一)(SQR C)) ) (如果(> BC) (如果(> AC) (+(SQR一)(SQR b)) (+(SQR b)(SQR C))) (+(SQR C)(SQR b))) )) (总和最大正方形7 8 10) – spheroid

+1

@spheroid你有三个级别的比较,而2是足够的。如果你知道'a'大于'b'那么'a'是两个最大的之一。那么你把最大的'b'和'c'。对于'a'小于'b'的情况,您取'b'和'a'和'c'中最大的一个。 – Sylwester