C 我不知道';我不知道如何纠正尾部递归(最初是常规递归)

C 我不知道';我不知道如何纠正尾部递归(最初是常规递归),c,recursion,tail-recursion,C,Recursion,Tail Recursion,我被分配了funct(),并被告知将其转换为尾部递归,因此我创建了funct2()。我使用了另一个堆栈溢出来开始,它可以正常工作,但它总是一个值关闭 我认为问题是由于y值最初为0,当转到函数的else部分时,从0中减去,而不是与初始x相等的值。但我不确定 #include <iostream> #include <stdio.h> using namespace std; int funct(int x); int funct2(int x, int y); int m

我被分配了funct(),并被告知将其转换为尾部递归,因此我创建了funct2()。我使用了另一个堆栈溢出来开始,它可以正常工作,但它总是一个值关闭

我认为问题是由于y值最初为0,当转到函数的else部分时,从0中减去,而不是与初始x相等的值。但我不确定

#include <iostream>
#include <stdio.h>
using namespace std;
int funct(int x);
int funct2(int x, int y);

int main() {

    int x = 24;

    printf("%d %d", funct(x), funct2(x, 0));


}

int funct(int x) {

    if (x <= 0){
        return 0;
    }
    else if (x & 0x01){
        return x + funct(x-1);
    }
    else {
        return x - funct(x-1);
    }

}

int funct2(int x, int y) {

    if (x < 0){
        return 0;
    }
    else if (x == 0){
        return y;
    }
    else if (x & 0x01){
        return funct2(x-1, y+x);
    }
    else {
        return funct2(x-1, y-(x-1));
    }

}
#包括
#包括
使用名称空间std;
int函数(int x);
int funct2(int x,int y);
int main(){
int x=24;
printf(“%d%d”,funct(x),funct2(x,0));
}
int函数(int x){
如果(x看一看,因为你的递归步骤不是相联的,你不能只用两个参数来实现尾递归。考虑通过三:

    int tailrec(int x, int k, int acc)
    {
        if (x < 0) {
            return acc;
        }
        if (k & 0x01) {
            return tailrec(x - 1, k + 1, k + acc);
        } else {
            return tailrec(x - 1, k + 1, k - acc);
        }
    }
inttailrec(intx,intk,intacc)
{
if(x<0){
返回acc;
}
if(k&0x01){
返回tailrec(x-1,k+1,k+acc);
}否则{
返回tailrec(x-1,k+1,k-acc);
}
}

尾部递归不是C语言级别的功能,因此,如果编译器不增加尾部调用的堆栈级别…这将是一个特定的优化…除非您使用goto和标签编写它…这是C级别的构造,邪恶,邪恶的构造。