Recursion 递归求幂球拍规划

Recursion 递归求幂球拍规划,recursion,scheme,racket,exponentiation,Recursion,Scheme,Racket,Exponentiation,我试图创建一个简单的递归求幂,但我得到了上面的错误。代码是自解释的。我是球拍编程的新手。我一直在看手册,但找不到我的错误。据推测,它显示错误是因为我的函数返回一个void而不是一个过程,但我不明白为什么它会返回void。我返回1或一个计算。 请提供帮助:/当您调用函数时,您要编写 #lang eopl (define (expo base n ) (cond( (or (= base 1) (= n 0) ) 1) (else (

我试图创建一个简单的递归求幂,但我得到了上面的错误。代码是自解释的。我是球拍编程的新手。我一直在看手册,但找不到我的错误。据推测,它显示错误是因为我的函数返回一个void而不是一个过程,但我不明白为什么它会返回void。我返回1或一个计算。
请提供帮助:/

当您调用函数时,您要编写

#lang eopl

  (define (expo  base n  )
         (cond( (or  (= base 1) (= n 0) ) 1)
                  (else ( (* base (expo(base (- n 1))) )   ) )))

-> (enter! "expo.rkt")
"expo.rkt"> (expo (2 1) )
; application: not a procedure;
;  expected a procedure that can be applied to arguments
;   given: 2
; [,bt for context]
而不是

(expo 2 1)
在递归函数的定义中也是如此

此外,该部件有双支架,这是不必要的

(expo (2 1))

当您调用函数时,您需要编写

#lang eopl

  (define (expo  base n  )
         (cond( (or  (= base 1) (= n 0) ) 1)
                  (else ( (* base (expo(base (- n 1))) )   ) )))

-> (enter! "expo.rkt")
"expo.rkt"> (expo (2 1) )
; application: not a procedure;
;  expected a procedure that can be applied to arguments
;   given: 2
; [,bt for context]
而不是

(expo 2 1)
在递归函数的定义中也是如此

此外,该部件有双支架,这是不必要的

(expo (2 1))

你有几个括号放错了地方。这将解决以下错误:

( (* base (expo(base (- n 1))) )
这就是你所说的:

(define (expo base n)
  (cond ((or (= base 1) (= n 0)) 1)
        (else (* base (expo base (- n 1))))))
请注意:在Scheme中,一对括号表示函数应用,因此当您编写
(23)
时,解释器认为
2
是一个函数,
3
是它的参数。。。显然,这行不通


所以,你必须非常小心地把那些
()
放在哪里,它们在世界上起着举足轻重的作用!为了让事情变得更简单,使用一个好的IDE,使用括号匹配和漂亮的语法着色,并对缩进进行额外的整理。正如@dyoo在评论中所建议的,DrRacket是一个很好的选择。

您有几个括号放错了位置。这将解决以下错误:

( (* base (expo(base (- n 1))) )
这就是你所说的:

(define (expo base n)
  (cond ((or (= base 1) (= n 0)) 1)
        (else (* base (expo base (- n 1))))))
请注意:在Scheme中,一对括号表示函数应用,因此当您编写
(23)
时,解释器认为
2
是一个函数,
3
是它的参数。。。显然,这行不通


所以,你必须非常小心地把那些
()
放在哪里,它们在世界上起着举足轻重的作用!为了让事情变得更简单,使用一个好的IDE,使用括号匹配和漂亮的语法着色,并对缩进进行额外的整理。正如@dyoo在评论中所建议的,DrRacket是一个很好的选择。

当a)您有两个以上的子句或b)您有一系列命令/表达式要为一个或多个子句执行时,最好使用
cond
语法形式。这两种情况不适用于您的代码。因此,您可以使用
if
获得更清晰的代码(更容易理解;更容易更正):

(expo 2 3)
=> 8

此外,研究一些“好”代码的间距和缩进;它将极大地帮助您理解。

当a)您有两个以上的子句或b)您有一系列命令/表达式用于一个或多个子句时,最好使用
cond
语法形式。这两种情况不适用于您的代码。因此,您可以使用
if
获得更清晰的代码(更容易理解;更容易更正):

(expo 2 3)
=> 8

此外,研究一些“好”代码的间距和缩进;它将极大地帮助你理解。

不必要的似乎意味着“可选的”。事实并非如此。在Scheme中,任何额外的括号(超出语法要求)都会使代码出错。括号必须在那里,也不能在那里;没有中间立场“不必要”似乎意味着“可选”。事实并非如此。在Scheme中,任何额外的括号(超出语法要求)都会使代码出错。括号必须在那里,也不能在那里;没有中间立场也许DrRacket会在错误的上下文中提供更好的突出显示?我怀疑如果这是在DrRacket中运行的,那么
(2 1)
部分将突出显示,以便更好地定位错误源。此外,您可能还需要进行idomatic格式化。在两个括号之间没有空格。在打开的paren之前应该是空格,而不是关闭的paren。在上面的表达式中嵌套表达式时,通常会缩进两个空格。Cond子句都应该垂直对齐,参数跨多行的任何表达式也应该垂直对齐。这有助于人们阅读您的代码,尤其是当代码开始变得更加复杂时。DrRacket是否能够更好地突出显示错误的上下文?我怀疑如果这是在DrRacket中运行的,那么
(2 1)
部分将突出显示,以便更好地定位错误源。此外,您可能还需要进行idomatic格式化。在两个括号之间没有空格。在打开的paren之前应该是空格,而不是关闭的paren。在上面的表达式中嵌套表达式时,通常会缩进两个空格。Cond子句都应该垂直对齐,参数跨多行的任何表达式也应该垂直对齐。这有助于人们阅读您的代码,尤其是当代码开始变得更加复杂时。一些样式指南更喜欢cond,因为它更易于修改。例如,将fast expo规则放入cond((偶数?n)(expo(*b)b(/n2))中并不重要,但将其放入if则是一个骗局。一些样式指南更喜欢cond,因为它更容易修改。例如,将fast expo规则放入cond((偶数?n)(expo(*b)b(/n2))中并不重要,但将其放入if中是一个骗局。谢谢您提供的信息。我将学习并牢记大家关于如何开始计划/球拍编程的建议。哇,这对我来说是一个新的开始。我想我甚至连信用卡/销售代表都没有。我没有代表。谢谢你提供的信息。我将学习并牢记大家关于如何开始计划/球拍编程的建议。哇,这对我来说是一个新的开始。我想我甚至连信用卡/销售代表都没有。我没有代表权。