Exercise1-29 <---> Exercise1-31
Exercise 1.30
The sum procedure above generates a linear recursion. The procedure can be rewritten so that the sum is performed iteratively. Show how to do this by filling in the missing expressions in the following definition:
(define (sum term a next b)
(define (iter a result)
(if <??>
<??>
(iter <??> <??>)))
(iter <??> <??>))
Ru: Процедура sum порождает линейную рекурсию. Ее можно переписать так, чтобы суммирование выполнялось итеративно. Покажите, как сделать это, заполнив пропущенные выражения в следующем определении:
(define (sum term a next b)
(define (iter a result)
(if <??>
<??>
(iter <??> <??>)))
(iter <??> <??>))
Scheme solution:
(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter
(next a)
(+ result (term a)))))
(iter a 0))
Haskell solution:
sum term a next b = iter a 0
where
iter a result | a > b = result
| otherwise = iter (next a) (result + term a)
OCaml solution: (version for floats)
let sum term a next b =
let rec iter a result =
if a > b then
result
else
iter (next a) (result +. term a)
in
iter a 0.
Standard ML solution: (version for reals)
fun sum (term, a, next, b) = let
fun iter (a, result) =
if a > b then
result
else
iter (next a, result + term a)
in
iter (a, 0.0)
end
Exercise1-29 <---> Exercise1-31