C 我不知道';我不知道如何纠正尾部递归(最初是常规递归)
我被分配了funct(),并被告知将其转换为尾部递归,因此我创建了funct2()。我使用了另一个堆栈溢出来开始,它可以正常工作,但它总是一个值关闭 我认为问题是由于y值最初为0,当转到函数的else部分时,从0中减去,而不是与初始x相等的值。但我不确定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
#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级别的构造,邪恶,邪恶的构造。