C中的尾递归

jes*_*ess 2 c recursion

我试图编写递归函数,找到一个数字的阶乘.

    int factorial(int input,int *answer)
    {
       if ( input ==0 )        
       {                       
        return 0;
       }

       *answer  = *answer * input;
       factorial(input -1, answer);
    }
Run Code Online (Sandbox Code Playgroud)

你对这个功能有什么看法?是尾递归吗?

nat*_*ose 6

在执行尾递归函数(尤其是尾递归函数)时,除了具有更友好接口的另一个函数之外,还有一个辅助函数通常是有帮助的.友好的接口函数实际上只是设置不太友好的函数的参数.

static unsigned factorial_helper(unsigned input, unsigned acc) {
       if (intput == 0) {
           return acc;
       }
       return factorial_helper(input-1, acc * input);
}

unsigned factorial(int input) {
    if (input < 0) {
        do_something_bad();
    }
    return factorial_helper(input, 1);
}
Run Code Online (Sandbox Code Playgroud)

通过传递一个累加器值,你可以避免在从被调用函数返回时使用指针或进行任何计算,这使得函数真正地是尾递归的.