用C语言为这段代码应用Tail Recursion?

时间:2015-10-18 19:41:43

标签: c recursion tail-recursion

下面是一段使用递归来查找产品的代码      数组中的数字,但我不知道如何递归地执行相同的尾部      有什么建议吗?

  int Product(int a[], int i, int n) 
   {
    return (i >= n) ? 1 : a[i] * Product(a, i + 1, n);
   }

1 个答案:

答案 0 :(得分:2)

在目前的形式中,您的代码不是递归递归的。递归调用必须是函数中的最后一条指令,并且在代码中,乘法发生在递归调用之后。因此,您必须更改签名以使用一个累加器来保存到目前为止的数字乘积:

int Product(int a[], int i, int n, int acc) 
{
   return (i >= n) ? 1 : Product(a, i + 1, n, a[i] * acc);
}

对于初始调用,您应该传递1作为累加器值。由于尾递归形式的使用非常方便,您可以将函数分离为辅助函数,并将其与实际实现分开:

int Product(int a[], int i, int n)
{
    return TailProduct(a, i, n, 1);
}

int TailProduct(int a[], int i, int n, int acc) 
{
   return (i >= n) ? 1 : Product(a, i + 1, n, a[i] * acc);
}