Не можете понять, как мы можем дать процедуры в качестве фактического параметра, когда формальные параметры используются в качестве значений в схеме?
В упражнении SICP 1,37
В разделе 1.3.3 в SICP прокрутите вниз до конца раздела (непосредственно перед 1.3.4), чтобы найти упражнение [3-е упражнение в разделе].
В соответствии с проблемой, я определил контракт как
(define (cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (cont-frac n d (- k 1))))
)
)
Ссылка на решение для упражнения
Согласно ссылке на решение приведенный выше код выглядит согласованным. Проблема возникает во второй части решения, когда n и d подставляются в виде (lamda (i) 1.0)
в части (а) решения, которое представляет собой процедуру.
Я не могу понять, как это будет работать при замене в процедуре cont-frac
, Когда я пытался, есть ошибка, которая говорит неправильный тип аргумента
Редактировать 1
Я добавил все мое решение. Это решает проблему, но не отражает суть раздела. Это решение упражнений 1.37, 1.38 и 1.39. Программа не использует процедуру в качестве общего метода, решения которой из приведенных ниже ссылок делают Решение до 1,37, Решение 1,38 и Решение 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)))
1 ответ
Связанный ответ выглядит неправильно, вы должны проходить процедуры, а не числа в качестве фактических параметров. Использование вспомогательной процедуры под названием 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