No idea how to solve SICP exercise 1.11

后端 未结 6 1636
感动是毒
感动是毒 2021-02-01 03:59

Exercise 1.11:

A function f is defined by the rule that f(n) = n if n < 3 and f(n) = f(n - 1) + 2f(n - 2)

6条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-01 04:52

    A function f is defined by the rule that f(n) = n, if n<3 and f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3), if n > 3. Write a procedure that computes f by means of a recursive process.

    It is already written:

    f(n) = n,                                  (* if *)  n < 3
         = f(n - 1) + 2f(n - 2) + 3f(n - 3),   (* if *)  n > 3
    

    Believe it or not, there was once such a language. To write this down in another language is just a matter of syntax. And by the way, the definition as you (mis)quote it has a bug, which is now very apparent and clear.

    Write a procedure that computes f by means of an iterative process.

    Iteration means going forward (there's your explanation!) as opposed to the recursion's going backwards at first:

    f(n)   =  f(n - 1) + 2f(n - 2) + 3f(n - 3) 
           =  a        + 2b        + 3c
    f(n+1) =  f(n    ) + 2f(n - 1) + 3f(n - 2)
           =  a'       + 2b'       + 3c'          a' = a+2b+3c, b' = a, c' = b
    ......
    

    This thus describes the problem's state transitions as

     (n, a, b, c)  ->  (n+1, a+2*b+3*c, a, b)
    

    We could code it as

    g (n, a, b, c) = g (n+1, a+2*b+3*c, a, b)
    

    but of course it wouldn't ever stop. So we must instead have

    f n = g (2, 2, 1, 0)
      where
      g (k, a, b, c) = g (k+1, a+2*b+3*c, a, b),    (* if *) k < n
      g (k, a, b, c) = a,                           otherwise 
    

    and this is already exactly like the code you asked about, up to syntax.

    Counting up to n is more natural here, following our paradigm of "going forward", but counting down to 0 as the code you quote does is of course entirely equivalent.

    The corner cases and possible off-by-one errors are left out as exercise non-interesting technicalities.

提交回复
热议问题