Math 如何调用在racket中接受参数的函数?
我的球拍语言还是新手。 我正在球拍上安装一个开关盒,但它不起作用。 因此,我转而使用相等和条件。我想知道如何调用接受输入的函数。例如:阶乘(n)函数 我想打电话进来:Math 如何调用在racket中接受参数的函数?,math,functional-programming,scheme,computer-science,racket,Math,Functional Programming,Scheme,Computer Science,Racket,我的球拍语言还是新手。 我正在球拍上安装一个开关盒,但它不起作用。 因此,我转而使用相等和条件。我想知道如何调用接受输入的函数。例如:阶乘(n)函数 我想打电话进来: (if (= c 1) (factorial (n)) 在racketlang中,带有if的条件句具有以下语法: (if <expr> <expr> <expr>) 结果将是6 更新: (define (factorial n) (if (= n 1) 1 (* n (factorial
(if (= c 1) (factorial (n))
在racketlang中,带有
if
的条件句具有以下语法:
(if <expr> <expr> <expr>)
结果将是6
更新:
(define (factorial n)
(if (= n 1) 1 (* n (factorial (- n 1)))))
(define (triple x)
(* 3 x))
(define (switchcase c)
(if (= c 1)
(factorial c)
(if(= c 2)
(triple c) "c is not 1 or 2")))
(switchcase 2)
此代码段存在两个语法问题:
(if (= c 1) (factorial (n)))
首先,球拍中的if
表达式需要三个部分:
(if <condition> <consequent> <alternative>)
现在是第二个问题:在Scheme中,当您用括号括住一个符号时,这意味着您正试图执行一个函数。因此,如果您编写(n)
,解释器认为n
是一个没有参数的函数,并且您正在尝试调用它。要解决此问题,只需删除n
周围的()
:
(if (= c 1) 1 (factorial n))
现在,语法问题已经解决了,让我们检查一下逻辑。在Scheme中,我们通常使用递归来表示解,但递归必须在某个点前进,所以它最终会结束。如果继续将相同的参数传递给递归,而不修改它,就会陷入无限循环。下面是编写递归factorial
过程的正确方法:
(define (factorial n)
(if (<= n 0) ; base case: if n <= 0
1 ; then return 1
(* n (factorial (- n 1))))) ; otherwise multiply and advance recursion
更新
在查看了注释之后,我发现您想要实现一个switchcase
过程。再一次,您声明函数的方式存在问题。这是错误的:
(define fact(x)
正确的方法是:
(define (fact x)
对于实际实现switchcase
,您可以尝试使用嵌套的if
s,但这不是最好的方法。了解如何使用表达式或表达式,两者都可以使解决方案更简单。无论如何,您必须提供一个附加条件,以防c
既不是1
也不是2
。此外,您还混淆了参数名称-它是c
还是x
?有了所有建议后,您的代码应该是这样的:
(define (switchcase c)
(cond ((= c 1) (fact c))
((= c 2) (triple c))
(else (error "unknown value" c))))
如果你想要的东西更接近开关箱,你可以返回程序
(define (switch input cases)
(let ((lookup (assoc input cases)))
(if lookup
(cdr lookup)
(error "Undefined case on " input " in " cases))))
(define (this-switch c)
(let ((cases (list (cons 1 triple)
(cons 2 factorial))))
((switch c cases) c)))
谢谢,但我不是那个意思。。我的意思是:(定义事实(X)(如果)@ USER 308063,你应该忘记在C++中尝试写C++。疯狂就是这样。你学习的是不同的语言,而不是不同的语法。你的代码已经调用了两个参数的两个参数(即,代码> C <代码>和<代码> 1 < /代码>)的函数(即,代码< >代码> >。。您没有将
c
和1
括在括号中,也不应该将n
括起来。
(define (fact x)
(define (switchcase c)
(cond ((= c 1) (fact c))
((= c 2) (triple c))
(else (error "unknown value" c))))
(define (switch input cases)
(let ((lookup (assoc input cases)))
(if lookup
(cdr lookup)
(error "Undefined case on " input " in " cases))))
(define (this-switch c)
(let ((cases (list (cons 1 triple)
(cons 2 factorial))))
((switch c cases) c)))