全局地在Scheme中存储值

全局地在Scheme中存储值,scheme,Scheme,我需要做一系列的数学运算。该函数的输入为n 前两个运算是求和运算。使用。结果需要存储为变量,以便在以后的函数中使用 (define (main n) (define (a1func n) (let* ((a1 0)) (let* ((i (- n 1))) (if (= n 1) 0 (+(/ 1 i) (a1func(- n 1))))))) (define (a2func n) (let ((a2 0)) (let ((i (- n

我需要做一系列的数学运算。该函数的输入为n

前两个运算是求和运算。使用。结果需要存储为变量,以便在以后的函数中使用

(define (main n)
 (define (a1func n)
   (let* ((a1 0))
   (let* ((i (- n 1)))
        (if (= n 1) 0
      (+(/ 1 i) (a1func(- n 1)))))))

 (define (a2func n)
   (let ((a2 0))
   (let ((i (- n 1)))
   (if (= n 1) 0
        (+(/ 1 (expt i 2)) (a2func(- n 1)))))))

  (define b1 
    (if (= n 1) 0
        (/(+ n 1)(* 3(- n 1))))) 
  (define b2 
    (if (= n 1) 0
        (/(* 2 (+ n 3 (expt n 2))) (*(- n 1)(* 9 n)))))
  (define c1 (- b1 (/ 1 a1)))   
  (define c2 (+ (- b2 (/ (+ n 2) (* a1 n))) (/ a2 (expt a1 2))))
  (define e1 (/ c1 a1))
  (define e2 (/ c2 (+ (expt a1 2) a2)))
  (list e1 e2))

我已经创建了单独列出的所有函数,但需要使用一个只接受n的主函数,以及一种全局存储变量的方法,以便在以后的函数中使用(不改变它们)。这是前两个函数

(define (main n)
 (define (a1func n)
   (let* ((a1 0))
   (let* ((i (- n 1)))
        (if (= n 1) 0
      (+(/ 1 i) (a1func(- n 1)))))))

 (define (a2func n)
   (let ((a2 0))
   (let ((i (- n 1)))
   (if (= n 1) 0
        (+(/ 1 (expt i 2)) (a2func(- n 1)))))))

  (define b1 
    (if (= n 1) 0
        (/(+ n 1)(* 3(- n 1))))) 
  (define b2 
    (if (= n 1) 0
        (/(* 2 (+ n 3 (expt n 2))) (*(- n 1)(* 9 n)))))
  (define c1 (- b1 (/ 1 a1)))   
  (define c2 (+ (- b2 (/ (+ n 2) (* a1 n))) (/ a2 (expt a1 2))))
  (define e1 (/ c1 a1))
  (define e2 (/ c2 (+ (expt a1 2) a2)))
  (list e1 e2))

使用另一个函数的输出生成函数计算结果的惯用方法是合成。在以下示例中,您希望
add2
处理
add1
的结果,并通过组合函数来实现这一点:

> (define (add1 n) (+ 1 n))
> (define (add2 n) (+ 2 n))

> (add2 (add1 10))
=> 13
如果您真的想使用全局状态,可以借助闭包来实现,这样全局名称空间本身就不会被破坏:

(define (make-adder n)
  (lambda (msg)
    (case msg
      ((one) 
       (set! n (+ 1 n)))       
      ((two) 
       (set! n (+ 2 n))))
    n))


> (define adder (make-adder 10))
> (adder 'one)
11
> (adder 'two)
13

函数式编程不同于命令式编程。Scheme是一种函数式语言。不要将绑定变量用作内存位置。但若你们需要像内存位置这样的东西,那个么就使用vector

如果要在另一个函数中使用变量值,请将其作为参数传递给该函数:

(define (fun1 n) ...)
(define (fun2 n) ...)
(define (fun4 n b) ...)

(define (main n)
  (let ((a1 (fun1 n))
        (b1 (fun2 n)))
    (let ((c1 (fun4 n b1)))
      ( .....)))...))))

这个问题是对我在原文中没有正确解释自己的问题的改写。。我还发布了我的全部代码(而不是其中的一个片段),以准确地演示我正在尝试做什么。我使用了两个独立的助手函数来获取a1和a2。然后,我使用一个完全独立的函数来完成其余的工作(在中调用我的两个助手函数)。我想我的错误是试图在彼此之间使用defines。特别是当其中两个函数是递归函数时。Scheme显然采取了与OOP不同的思维方式。