#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或计算。 请帮助:/
答案 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)))))
另外,研究一些“好”代码的间距和缩进;它将极大地帮助您理解。