递归指数球拍编程

时间:2013-09-19 03:06:37

标签: recursion scheme racket exponentiation

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

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

3 个答案:

答案 0 :(得分: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是一个函数而{{1}是它的论点......显然这是行不通的。

因此,你必须非常小心地放置那些3,它们会让世界变得与众不同!为了方便起见,可以使用带有括号匹配和良好语法着色的优秀IDE,并对缩进进行额外的整理。正如@dyoo在评论中所建议的,DrRacket是一个很好的选择。

答案 1 :(得分:0)

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

(expo 2 1)

而不是

(expo (2 1))

在递归函数定义的定义中也是如此。

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

( (* base (expo(base (- n 1))) )

答案 2 :(得分:0)

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

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

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