Math 如何调用在racket中接受参数的函数?

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

我的球拍语言还是新手。 我正在球拍上安装一个开关盒,但它不起作用。 因此,我转而使用相等和条件。我想知道如何调用接受输入的函数。例如:阶乘(n)函数 我想打电话进来:

(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)))