0
#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]

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

4

3 回答 3

3

你有几个放错位置的括号。这应该解决错误:

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

这就是你所说的:

(expo 2 3)
=> 8

作为记录:在Scheme中,一对括号表示函数应用程序,所以当你编写(2 3)解释器时认为这2是一个函数并且3是它的参数......显然这是行不通的。

所以你必须非常小心你把它们放在哪里(),它们会改变世界!为了让事情变得更容易,请使用具有括号匹配和良好语法着色的良好 IDE,并在缩进方面更加整洁。正如@dyoo 在评论中所建议的那样,DrRacket 是一个很好的选择。

于 2013-09-19T03:57:10.083 回答
0

当你调用函数时,你想写

(expo 2 1)

而不是

(expo (2 1))

递归函数定义的定义相同。

另外,这部分有双括号,这是不必要的。

( (* base (expo(base (- n 1))) )
于 2013-09-19T03:17:21.337 回答
0

conda) 您有两个以上的子句或 b) 您有一系列命令/表达式要为一个或多个子句执行时,最好使用句法形式。这两种情况不适用于您的代码。因此,您将拥有更清晰的代码(更容易理解;更容易正确)if,如下所示:

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

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

于 2013-09-19T04:08:08.613 回答