无法理解当形式参数用作方案中的值时我们如何将程序作为实际参数?
Cannot understand how we can give a procedures as actual parameter when formal parameters are used as values in scheme?
在 SICP 练习 1.37
Section 1.3.3 in SICP 向下滚动到本节末尾(就在 1.3.4 之前)以找到练习 [本节中的第 3 个练习]。
根据问题,我定义cont-frac为
(define (cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (cont-frac n d (- k 1))))
)
)
Link to solution for the exercise
根据解法link上面的代码似乎是一致的。
问题出现在解决方案的第二部分,当 n 和 d 被替换为 (lamda (i) 1.0)
时,在解决方案的 (a) 部分,这是一个过程。
我不明白在 cont-frac
的过程中替换时这将如何工作。当我尝试时,出现错误 Wrong type of argument
编辑 1
我已经添加了我的整个解决方案。它解决了问题,但没有抓住该部分的本质。这是练习 1.37、1.38 和 1.39 的答案。
该程序不使用 过程作为一般方法 以下 link 的解决方案 Solution to 1.37, Solution to 1.38 and Solution to 1.39
在下面的程序中
在程序 phi
和 e-2-val
中,k 是连续分数中的步数
在程序tan
中,k是以弧度为单位的角度(精确值的步数为1000)
#!/usr/local/bin/guile \
-e main -s
!#
(define (finite-cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (finite-cont-frac n d (- k 1))))))
(define (e-2 n d k1 c k)
(define (d-val)
(if (= (modulo k1 3) 1)
(+ c 2)
1))
(define (c-val)
(if (= (d-val) 1) c (d-val)))
(if (= k 0)
0
(/ n (+ (d-val) (e-2 n (d-val) (+ k1 1) (c-val) (- k 1))))))
(define (tan-cf n k d k1)
(define (d-val)
(if (= k1 0) 1 (+ d 2)))
(if (= k 0)
0
(/ n (+ (d-val) (tan-cf n (- k 1) (d-val) (+ k1 1))))))
(define (tan-man x kk)
(let ((a (- (* x x))))
(tan-cf a kk 1 0)))
(define rrr 80.0)
(define (main args)
(let* ((k (string->number (list-ref args 1)))
(phi (/ 1.0 (finite-cont-frac 1.0 1.0 k)))
(e-2-val (e-2 1.0 1 0.0 0 k))
(tt (/ (tan-man k 1000) (- 0.0 k))))
(display tt)
(newline)))
链接的答案看起来有误,您应该通过 程序,而不是数字作为实际参数。使用名为 accumulate
:
的辅助过程
(define (accumulate combiner null-value term1 term2 a next b)
(if (> a b)
null-value
(combiner (term1 a)
(term2 a)
(accumulate combiner
null-value
term1
term2
(next a)
next
b))))
(define (cont-frac n d k)
(accumulate (λ (x y rec) (/ x (+ y rec)))
0 n d 1 add1 k))
现在我们可以按预期调用过程了:
(cont-frac (lambda (i) 1.0)
(lambda (i) 1.0)
10)
=> 0.6179775280898876
在 SICP 练习 1.37
Section 1.3.3 in SICP 向下滚动到本节末尾(就在 1.3.4 之前)以找到练习 [本节中的第 3 个练习]。
根据问题,我定义cont-frac为
(define (cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (cont-frac n d (- k 1))))
)
)
Link to solution for the exercise
根据解法link上面的代码似乎是一致的。
问题出现在解决方案的第二部分,当 n 和 d 被替换为 (lamda (i) 1.0)
时,在解决方案的 (a) 部分,这是一个过程。
我不明白在 cont-frac
的过程中替换时这将如何工作。当我尝试时,出现错误 Wrong type of argument
编辑 1
我已经添加了我的整个解决方案。它解决了问题,但没有抓住该部分的本质。这是练习 1.37、1.38 和 1.39 的答案。 该程序不使用 过程作为一般方法 以下 link 的解决方案 Solution to 1.37, Solution to 1.38 and Solution to 1.39
在下面的程序中
在程序 phi
和 e-2-val
中,k 是连续分数中的步数
在程序tan
中,k是以弧度为单位的角度(精确值的步数为1000)
#!/usr/local/bin/guile \
-e main -s
!#
(define (finite-cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (finite-cont-frac n d (- k 1))))))
(define (e-2 n d k1 c k)
(define (d-val)
(if (= (modulo k1 3) 1)
(+ c 2)
1))
(define (c-val)
(if (= (d-val) 1) c (d-val)))
(if (= k 0)
0
(/ n (+ (d-val) (e-2 n (d-val) (+ k1 1) (c-val) (- k 1))))))
(define (tan-cf n k d k1)
(define (d-val)
(if (= k1 0) 1 (+ d 2)))
(if (= k 0)
0
(/ n (+ (d-val) (tan-cf n (- k 1) (d-val) (+ k1 1))))))
(define (tan-man x kk)
(let ((a (- (* x x))))
(tan-cf a kk 1 0)))
(define rrr 80.0)
(define (main args)
(let* ((k (string->number (list-ref args 1)))
(phi (/ 1.0 (finite-cont-frac 1.0 1.0 k)))
(e-2-val (e-2 1.0 1 0.0 0 k))
(tt (/ (tan-man k 1000) (- 0.0 k))))
(display tt)
(newline)))
链接的答案看起来有误,您应该通过 程序,而不是数字作为实际参数。使用名为 accumulate
:
(define (accumulate combiner null-value term1 term2 a next b)
(if (> a b)
null-value
(combiner (term1 a)
(term2 a)
(accumulate combiner
null-value
term1
term2
(next a)
next
b))))
(define (cont-frac n d k)
(accumulate (λ (x y rec) (/ x (+ y rec)))
0 n d 1 add1 k))
现在我们可以按预期调用过程了:
(cont-frac (lambda (i) 1.0)
(lambda (i) 1.0)
10)
=> 0.6179775280898876