我的某个程序的开头会导致错误。这是问题所在。我试图将变量定义为递归函数的结果。
(define (test n)
(define (a1func i)
(if (= i 1) 0
(+ (/ 1 i) (a1func (- i 1)))))
(define a1 (a1func (- n 1))))
如果您说它(test 10)
,则错误将是:
程序申请:预期程序,给定:
#<undefined>
;争论是:9
我认为这可以在Scheme中完成?想法?
答案 0 :(得分:1)
在纯FP语言中,计算通过将参数传递给函数来完成,这些函数返回一些值作为结果。您可以在调用test
的函数中绑定test
的结果:
(define (test n)
(define (a1func i)
(if (= i 1) 0
(+ (/ 1 i) (a1func (- i 1)))))
(a1func (- n 1)))
(define (calltest x)
(define (r (test (+ 2 x))))
(- r 4))
变量通常绑定一次,不能更改。函数必须返回值,表达式的结果,但(define a1 (a1func(- n 1)))
是一个定义,而不是表达式,所以正确的代码是:
(define (test n)
(define (a1func i)
(if (= i 1) 0
(+(/ 1 i) (a1func(- i 1)))))
(define a1 (a1func(- n 1)))
a1)
由于定义变量并立即返回它是没有意义的,更正确的代码将是:
(define (test n)
(define (a1func i)
(if (= i 1) 0
(+(/ 1 i) (a1func(- i 1)))))
(a1func(- n 1)))
答案 1 :(得分:0)
如果你的方案实现支持lisp宏,那么你可以这样写:
(define-macro (test n)
(define (a1func i)
(if (= i 1) 0
(+ (/ 1 i) (a1func (- i 1)))))
`(define a1 ,(a1func (- n 1))))
或使用名为let
(define-macro (test n)
`(define a1 ,(let a1func ((i (- n 1)))
(if (= i 1)
0
(+ (/ 1 i) (a1func (- i 1)))))))