How to improve this piece of code?

My solution to Exercise 1.11 SICP:

(define (f n)
  (if (< n 3)
   n
   (+ (f (- n 1)) (* 2 (f (- n 2))) (* 3 (f (- n 3))))
   ))

As expected, an evaluation such as (f 100) is time consuming. I was wondering if there is a way to improve this code (without mentioning recursion) and / or use a multi-core box. I use the mit circuit.

+3
source share
6 answers

, Scheme, - memoization. , , f (p) (, p , , n ), , f (p), , . ( ) .

+4

, f " ", , f " ". . fib, , , , fib:

; Recursive
(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

; Iterative
(define (fib n)
  (fib-iter 1 0 n))

(define (fib-iter a b count)
  (if (= count 0)
      b
      (fib-iter (+ a b) a (- count 1))))

f-iter, a, b c, count.

f-iter. fib-iter:

(define (f-iter a b c count)
  (if (= count 0)
      c
      (f-iter (+ a (* 2 b) (* 3 c)) a b (- count 1))))

, a, b c 2, 1 0 , fib, a b 1 0. f :

(define (f n)
  (f-iter 2 1 0 n))

: f-iter - , - , , O(n) O(1) space, , , . , , 1.1.

+8

, , , . , , , . . .

edit: oops, , , . .

+2

. . Common LISP, , . bogo-fig .

+1

:

, , .

* +, ( * + .)

f-iter , (.. , ).

:

(define (f n)
  (let iter
    ((a 2) (b 1) (c 0) (count n))
    (if (<= count 0)
      c
      (iter (+ a (* 2 b) (* 3 c)) a b (- count 1)))))

(define (f n)
  (do
    ((a 2 (+ a (* 2 b) (* 3 c)))
     (b 1 a)
     (c 0 b)
     (count n (- count 1)))
    ((<= count 0) c)))
0

, - , ( , ), , , , . :

(define (f n)
  (define (iter a b c count)
    (if (zero? count)
        c
        (iter (+ a (* 2 b) (* 3 c))
              a
              b
              (- count 1))))
  (if (< n 3)
      n
      (iter 2 1 0 n)))
0

Source: https://habr.com/ru/post/1706780/


All Articles