В упражнении SICP 1.37Не можете понять, как мы можем дать процедуры как фактический параметр, когда формальные параметры используются в качестве значений в схеме?
Section 1.3.3 in SICP Прокрутите вниз до конца раздела (непосредственно перед 1.3.4), чтобы найти упражнение [3-е упражнение в разделе].
По этой проблеме, я определил прод-гидроразрыва в
(define (cont-frac n d k)
(if (= k 0)
0
(/ n (+ d (cont-frac n d (- k 1))))
)
)
Link to solution for the exercise
Согласно решению связать приведенный выше код, кажется, быть последовательным. Проблема возникает во второй части раствора, когда n и d заменяются как (lamda (i) 1.0)
, частью (а) решения, которое является процедурой.
Я не могу понять, как это будет работать при замене в процедуре cont-frac
. Когда я попробовал, есть ошибка, которая говорит Неверный тип аргумента
Edit 1
Я добавил все мое решение. Он решает проблему, но не отражает суть раздела. Это решение упражнений 1.37, 1.38 и 1.39. Программа не использует процедуры, как общий метод, какие решений по ссылкам ниже делать Solution to 1.37, Solution to 1.38 и Solution to 1.39
В приведенной ниже программе
в процедурах phi
и e-2-val
, к не из шагов по-прежнему фракция
в процедуре tan
, к пока угол в радианах (нет шагов 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)))
Обратите внимание, что закрытие скобок не должно быть на их собственной линии, как C фигурной скобкой программирования. Они должны быть на линии выше рядом с последней закрывающей скобкой. – Sylwester
Это как идиоматическое правило? Потому что это не дает никакой ошибки. –
* TL; DR Это консенсус. * Это правда, что это не влияет на интерпретации. У вас может быть один символ или скобка на каждой строке, что делает ваш пример длиной в несколько страниц нечитаемым, но вполне исполняемым кодом. Lisp имеет очень мало структуры в своем коде, поэтому, как вы создаете код, как вы делаете его читабельным. Существуют [руководства по стилям] (http://mumble.net/~campbell/scheme/style.txt), в которых lispers соглашаются и вопросы об этом на [PSE] (http://programmers.stackexchange.com/questions/99229/why-does-the-lisp-community-prefer-to-accumulate-all-the-parentheses-at-the-end) – Sylwester