Не можете понять, как мы можем дать процедуры в качестве фактического параметра, когда формальные параметры используются в качестве значений в схеме?

В упражнении 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
Другие вопросы по тегам