我需要执行一系列数学运算。函数的输入是n。
前两个操作是总结。使用n。结果需要存储为变量以便在以后的函数中使用。
离。
main func(n)
func1 (n)
returns a1
func2 (n)
returns b1
func4
uses b1 to compute c1
etc....
我创建了所有单独的函数但需要使用仅接受n的main函数,以及一种全局存储变量以便在以后的函数中使用的方法(不更改它们)。这些是前两个功能。
(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))
答案 0 :(得分:1)
功能编程与命令式编程不同。 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)))
( .....)))...))))
答案 1 :(得分:0)
使用另一个函数的输出来创建函数计算结果的惯用方法是组合。在以下示例中,您希望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