Function 完全被球拍语法搞糊涂了-请帮忙

Function 完全被球拍语法搞糊涂了-请帮忙,function,functional-programming,boolean,racket,Function,Functional Programming,Boolean,Racket,我被要求为大学学习一些技巧,最终将不得不用树结构和数据集做一些相当复杂的事情。我刚刚开始,我无法理解这段代码是如何工作的,即使是Racket文档、google等等 我正在尝试编写一个函数,它接受三个数字参数并返回最大值,以下是我得到的: (define (mymax x1 x2 x3) (cond ((and (x1 > x2) (x1 > x3)) x1) (else (and (x2 > x1) (x2 > x3)) x2)

我被要求为大学学习一些技巧,最终将不得不用树结构和数据集做一些相当复杂的事情。我刚刚开始,我无法理解这段代码是如何工作的,即使是Racket文档、google等等

我正在尝试编写一个函数,它接受三个数字参数并返回最大值,以下是我得到的:

(define (mymax x1 x2 x3)
    (cond
        ((and (x1 > x2) (x1 > x3)) x1)
        (else (and (x2 > x1) (x2 > x3)) x2)
        (else (and (x3 > x1) (x3 > x2)) x3)
))
(print (mymax 10 5 1))
所以

  • 我不知道我是否正确地使用了和比较
  • 我在:(else(和(x2>x1)(x2>x3))x2中得到错误“cond:bad语法(`else'子句必须是最后一个)”
  • 我真的不知道如何从函数返回值

很抱歉,我不太明白,但这是没有意义的,任何有助于阐明这些要点的帮助都将是巨大的帮助

以下是条件表达式的语法

(cond
  [ConditionExpression1 ResultExpression1]
  [ConditionExpression2 ResultExpression2]
  ... 
  [ConditionExpressionN ResultExpressionN])


(cond
  [ConditionExpression1 ResultExpression1]
  [ConditionExpression2 ResultExpression2]
  ...
  [else DefaultResultExpression])
(cond
  [(= 2 0) #false]
  [(> 2 1) (string=? "a" "a")]
  [else (= (/  1 2) 9)])
条件表达式的计算遵循两条规则

1)规则条件为假

(cond                    == (cond
  [#false ...]               ; first line removed
  [condition2 answer2]       [condition2 answer2]
  ...)                       ...)
(cond                    == answer-1
  [#true answer-1]
  [condition2 answer2]
  ...)
2)规则条件为真

(cond                    == (cond
  [#false ...]               ; first line removed
  [condition2 answer2]       [condition2 answer2]
  ...)                       ...)
(cond                    == answer-1
  [#true answer-1]
  [condition2 answer2]
  ...)
当条件为else时,第二条规则也适用(但请注意,else只能出现在最后一个子句中)


示例

(cond
  [ConditionExpression1 ResultExpression1]
  [ConditionExpression2 ResultExpression2]
  ... 
  [ConditionExpressionN ResultExpressionN])


(cond
  [ConditionExpression1 ResultExpression1]
  [ConditionExpression2 ResultExpression2]
  ...
  [else DefaultResultExpression])
(cond
  [(= 2 0) #false]
  [(> 2 1) (string=? "a" "a")]
  [else (= (/  1 2) 9)])
={通过计算
(=20)
#false
}

(cond
  [#false #false]
  [(> 2 1) (string=? "a" "a")]
  [else (= (/  1 2) 9)])
=={按规则条件为假}

=={通过计算
(>21)
#true
}

(cond
  [#true (string=? "a" "a")]
  [else (= (/  1 2) 9)])
#true
=={按规则条件为真}

=={通过计算
(字符串=?“a”“a”)
true
}

(cond
  [#true (string=? "a" "a")]
  [else (= (/  1 2) 9)])
#true

  • (2>1)
    这样的表达式不起作用。它应该是
    (>21)
    函数应用程序的语法是前缀语法,即开括号后应紧跟函数名,函数名后应紧跟参数

  • 您得到的错误是第二个子句的语法错误<代码>(和(x2>x1)(x2>x3))x2)本条共有三条:
    else
    (和(x2>x1)(x2>x3))
    ,和
    x2
    。但是,根据
    cond
    的语法,一个子句应该只有两个片段

去掉
else
s并设置
前缀后:

(define (mymax x1 x2 x3)
  (cond
    ((and (>  x1 x2) (> x1 x3)) x1)
    ((and (> x2 x1) (> x2 x3)) x2)
    ((and (>  x3 x1) (> x3 x2)) x3)))

(print (mymax 10 5 1))
程序将打印
10
。但是请注意,它不适用于
(mymax 5)
,因此我们将所有
s转换为
=
s:

(define (mymax x1 x2 x3)
  (cond
    [(and (>= x1 x2) (>= x1 x3)) x1]
    [(and (>= x2 x1) (>= x2 x3)) x2]
    [(and (>=  x3 x1) (>= x3 x2)) x3]))

(mymax 10 5 1)
; => 10
(mymax 5 5 5)
; => 5
最后,函数不“返回”值。一个更好的心理模型是认为他们的身体降低到某个值

(define (f x-1 ... x-n)
  f-body)

(f v-1 ... v-n) 
; == f-body
; with all occurrences of x-1 ... x-n 
; replaced with v-1 ... v-n, respectively

请参阅:,.

只有最后一个词可能包含关键字
else
,而不是计算结果始终为true的表达式。你可以把它看作是amd的同义词,因为每种情况都是正确的,
cond
后面没有更多的子句,因为它们只有在前面所有的条件都是错误的情况下才被计算。例如,您可以编写
if(true)
,而不是c语言中的'else'。如果后面有
elseif
的用法,则
cond
else
子句与其他语言中的
switch
语句的
default
情况类似。在第二种情况下,只需删除else关键字。谢谢大家,但仍然困惑不解。我删除了第二个案例的else,运行并得到错误“application:不是一个过程;期望一个可以应用于给定参数的过程:10个参数…:”非常感谢您花时间解释这一点。这是我第一次看到这样的编程语言,它与我使用的其他语言完全不同。干杯:)