tail recursion vs. forward recursion

后端 未结 3 2071
萌比男神i
萌比男神i 2020-12-04 18:21

Can someone give me the difference between these two kinds recursions and example (specifically in OCaml)?

3条回答
  •  孤城傲影
    2020-12-04 18:57

    A tail recursive function is a function where the only recursive call is the last one in the function. A non-tail recursive function is a function where that is not the case.

    A backward recursion is a recursion where in each recursive call the value of the parameter is less than in the previous step. A forward recursion is a recursion where it grows bigger with each step.

    Those are two orthogonal concepts, i.e. a forward recursion may or may not be tail-recursive and the same applies to backward recursions.

    For example the factorial function is often written like this in imperative languages:

    fac = 1
    for i from 1 to n:
        fac := fac * i
    

    The common recursive version of factorial counts backwards (i.e. it calls itself with n-1 as the parameter), however if you'd directly translate the above imperative solution, you'd come up with a recursive version that counts upwards. It would look something like this:

    let fac n =
      let rec loop i =
        if i >= n
        then i
        else i * loop (i+1)
      in
        loop 1
    

    This is a forward recursion and as you can see it is slightly more cumbersome than the backward recursive variant as it requires a helper function. Now this is not tail recursive as the last call in loop is the multiplication, not the recursion. So to make it tail-recursive, you'd do something like this:

    let fac n =
      let rec loop acc i =
        if i >= n
        then acc
        else loop (i*acc) (i+1)
      in
        loop 1 1
    

    Now this is both a forward recursion and a tail recursion because the recursive call is a) a tail-call and b) calls itself with a greater value (i+1).

提交回复
热议问题