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
。不是那样编译的。