【问题标题】:Scheme - define variable as the result of a function?方案 - 将变量定义为函数的结果?
【发布时间】:2011-06-15 15:42:22
【问题描述】:

我的一个程序的开始导致错误。这是问题区域。我正在尝试将变量定义为递归函数的结果。

(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 中完成??想法?

【问题讨论】:

  • 您的代码不完整。剩下的可以发吗?
  • 顺便说一句,您的代码在最后一行的末尾缺少一个结束 )

标签: function functional-programming scheme


【解决方案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)))

【讨论】:

  • 问题是我需要将 a1 绑定到 a1func 的结果值。我稍后在程序中使用值 a1 以及变量 n(原始输入)。
  • 那么你应该在你的模块顶部定义a1,因为在你原来的定义中a1在函数test的范围内,否则没有其他函数可以使用它。如果你在模块顶部定义a1,那么你应该以同样的方式定义a1func,这样它就可以在test的范围之外访问。
  • 我要再试一次。我不知道为什么我会遇到这样的问题。所以我又从头开始了。我有一个程序,它的值是 n。这个程序比必须运行几个数学运算。其中一些操作使用早期操作的值。前任。 (define (a1func1 n) (let* ((e1 0)) (let* ((i (- n 1))) (if (= n 1) 0 (+(/ 1 i) (a1func1(- n 1) )))))) ...我得到正确的结果,但需要全局存储。在后面的几个函数中使用。
  • @DJPlayer:在 FP 中,您通常不会全局存储变量,函数式程序只是对函数的一系列 [相互] 调用,当每个函数对给定参数执行一些计算并返回结果时.你应该明白,如果你给它相同的参数,一个函数总是返回相同的结果,例如。 G。如果你给它23 并且它计算一个总和,它总是返回5,不管调用它的次数。你可能有全局变量(使用define),但它们不能被改变(如果我们谈论的是纯FP)。
【解决方案2】:

如果你的方案实现支持 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)))))))

【讨论】:

    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2012-11-21
    • 2020-04-27
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多