Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的尾部递归_C_Recursion - Fatal编程技术网

C语言中的尾部递归

C语言中的尾部递归,c,recursion,C,Recursion,我试着写递归函数,找到一个数的阶乘 int factorial(int input,int *answer) { if ( input ==0 ) { return 0; } *answer = *answer * input; factorial(input -1, answer); } 关于这个函数你会怎么说?它是尾

我试着写递归函数,找到一个数的阶乘

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

       *answer  = *answer * input;
       factorial(input -1, answer);
    }

关于这个函数你会怎么说?它是尾部递归的吗?

这里有一个带有定义的链接:

“如果函数做的最后一件事是进行递归调用,那么它就是尾部递归的。”


在您发布的代码中,函数所做的最后一件事是对自身进行递归调用,因此根据此定义,它是尾部递归的。

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

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);
}
static unsigned factorial\u helper(unsigned input,unsigned acc){
如果(输入=0){
返回acc;
}
返回阶乘辅助(输入-1,acc*输入);
}
无符号阶乘(整数输入){
如果(输入<0){
做坏事;
}
返回阶乘辅助(输入,1);
}

通过传递累加器值,可以避免在从被调用函数返回时使用指针或进行任何计算,从而使函数真正具有尾部递归性。

如果没有return语句,此函数只会产生未定义的行为。@James:实际上,看起来他试图将结果存储到
answer
中,而不是返回任何值。它似乎假设
*答案
初始化为1。@卡萨布兰卡:这很好,但函数的返回类型为
int
,实际上不返回值。@James:同意,返回类型在这里毫无意义
void
可以正常工作。是的,不需要真正的void。在第2行,您编写了
intput
而不是
input
。不是那样编译的。