【发布时间】:2020-05-04 03:36:19
【问题描述】:
我为一个程序找到了这个算法,它返回具有特定周长的可能三角形的数量。我知道这个问题还有其他一些方法,但是使用它们我会得到大量的时间限制错误,可能是因为它们没有优化。这似乎更加优化,但我得到堆栈溢出递归大输入。任何人都可以通过将其转换为尾递归或对这个问题做其他事情来帮助我优化它吗?
这是我找到的算法:
#include<iostream>
using namespace std;
int foo(int);
int main(){
int n;
cin>>n;
cout<<foo(n);
return 0;
}
int foo(int n){
int p=n/2-2;
int t;
if(p%6<5&&p%6>0)
t=(p+6-p%6)/6;
else if(p%6==5)
t=(p+6-p%6)/6+1;
else
t=p/6;
if(n==3||n==5||n==6)
return 1;
else if(n==4)
return 0;
else{
if(n%2==0)
return foo(n-3);
else
return foo(n+1)+t;
}
}
【问题讨论】:
-
恭喜,您的代码可以编译。现在,请提供一些具有预期结果的测试输入,以实现minimal reproducible example。我知道它目前看起来相当小,但请查看“stackoverflow.com/help/minimal-reproducible-example”......我们需要知道哪些输入会重现您遇到的错误。
-
你如何说服自己代码是尾递归的还是不是尾递归的?
-
你指定了哪些编译选项......我想我从未见过 -O0 输出尾递归可执行文件。
-
考虑查看stackoverflow.com/a/58324382/2785528,了解如何理解递归函数的执行顺序。
-
我投票决定关闭主题,因为您的问题不属于帮助中心定义的范围。如果没有输入和预期输出,问题就无法重现。
标签: c++ recursion tail-recursion