SICP - 具有更多抽象的代码改进
SICP - Code improvement with more abstraction
我正在使用 SICP 书并且做了这个练习:
1.11 函数 f 由以下规则定义:如果 n<3 且 f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3) 如果 n> 3。编写一个程序,通过递归过程计算 f。编写一个通过迭代过程计算 f 的过程。
递归过程很简单。迭代的更难。
我做了这个代码:
(define (f-ltail n)
(f-iter 0 n))
(define (f-iter produto n)
(define counter (- n 2))
(cond ((< n 3) n)
((= counter 0) produto)
(else (+ produto (+ (f-iter produto (- n 1))
(* 2 (f-iter produto (- n 2)))
(* 3 (f-iter produto (- n 3))))))))
我的教授一直说我们应该避免定义不需要定义的东西。
这个定义真的需要吗?
(define counter (- n 2))
如果不是,请问如何去掉这段代码?
本书 gives an example 迭代计算斐波那契数列。
(define (fib n)
(fib-iter 1 0 n))
(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
请注意,不是在 fib-iter
函数内定义计数器变量,而是将参数传递给函数以跟踪该值。您可以在函数中遵循相同的模式。
我正在使用 SICP 书并且做了这个练习:
1.11 函数 f 由以下规则定义:如果 n<3 且 f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3) 如果 n> 3。编写一个程序,通过递归过程计算 f。编写一个通过迭代过程计算 f 的过程。
递归过程很简单。迭代的更难。
我做了这个代码:
(define (f-ltail n)
(f-iter 0 n))
(define (f-iter produto n)
(define counter (- n 2))
(cond ((< n 3) n)
((= counter 0) produto)
(else (+ produto (+ (f-iter produto (- n 1))
(* 2 (f-iter produto (- n 2)))
(* 3 (f-iter produto (- n 3))))))))
我的教授一直说我们应该避免定义不需要定义的东西。
这个定义真的需要吗?
(define counter (- n 2))
如果不是,请问如何去掉这段代码?
本书 gives an example 迭代计算斐波那契数列。
(define (fib n)
(fib-iter 1 0 n))
(define (fib-iter a b count)
(if (= count 0)
b
(fib-iter (+ a b) a (- count 1))))
请注意,不是在 fib-iter
函数内定义计数器变量,而是将参数传递给函数以跟踪该值。您可以在函数中遵循相同的模式。