尾递归与向前递归

有人可以给我这两种递归和例子之间的区别(具体在OCaml中)?
尾递归函数是一个函数,其中唯一的递归调用是函数中的最后一个。非尾递归函数是不是这样的函数。

反向递归是一种递归,其中在每个递归调用中,参数的值小于上一步中的值。向前递归是一个递归,它每个步骤都变大。

那些是两个正交概念,即前向递归可以是或不是尾递归的,并且相同的方式适用于向后递归。

例如,阶乘函数通常用命令式语言写成:

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

阶乘的常见递归版本向后计数(即以n-1为参数调用自身),但是如果您直接翻译上述命令式解决方案,则可以提出递增的递归版本。它看起来像这样:

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

这是一个向前递归,您可以看到它比后向递归变体稍微更麻烦,因为它需要帮助函数。现在这不是尾递归,因为循环中的最后一个调用是乘法,而不是递归。所以为了使它的尾递归,你会做这样的事情:

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

现在这是一个向前递归和一个尾递归递归,因为递归调用是a)一个尾调用,b)调用一个更大的值(i 1)。

翻译自:https://stackoverflow.com/questions/3042954/tail-recursion-vs-forward-recursion

转载注明原文:尾递归与向前递归