SICPでは、関数の使い方を学びました。これは驚くほど便利です。しかし、以下のコードのように、ネストされた関数のコストと混同しています。
(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess)
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))
3つの子関数を定義していますが、効率とコストはどうですか? このような関数呼び出しをさらに使用すると?
更新:除数の検索で、以下のコードを見てください
(define (smallest-divisor n)
(find-divisor n 2))
(define (find-divisor n test-divisor)
(cond ((> (square test-divisor) n) n)
((divides? test-divisor n) test-divisor)
(else (find-divisor n (+ test-divisor 1)))))
(define (divides? a b)
(= (remainder b a) 0))
(define (prime? n)
(= n (smallest-divisor n)))
Q1 :分け目は?明確にするために、最小除数は必要ありません。効率とコストはどうですか?Scheme コンパイラはこの状況を最適化しますか。もう少しコンパイラの知識を勉強したほうがいいと思います(͡๏̯͡๏)
q2 : 通訳ではどうですか?