Function 完全被球拍语法搞糊涂了-请帮忙
我被要求为大学学习一些技巧,最终将不得不用树结构和数据集做一些相当复杂的事情。我刚刚开始,我无法理解这段代码是如何工作的,即使是Racket文档、google等等 我正在尝试编写一个函数,它接受三个数字参数并返回最大值,以下是我得到的: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)
(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个参数…:”非常感谢您花时间解释这一点。这是我第一次看到这样的编程语言,它与我使用的其他语言完全不同。干杯:)