【发布时间】:2016-01-09 16:29:47
【问题描述】:
我正在创建一个程序,该程序仅使用 1、2、6 和 13 返回获得数字 (n) 所需的最少数量的总和。它非常适用于 n 的小值,但一旦 n 得到值像 200 一样,程序计算结果需要太多时间。
因此,我有两个问题:
1.有什么方法可以让递归更快?
2.我应该避免使用递归而使用循环吗?
这是注释代码:
#include <iostream>
#define MAX 500000
using namespace std;
void cal(int inp, int &mini, int counter = 0);
int main (void)
{
//Gets input
int n;
cin >> n;
//Defines mini as the MAX result we can get
int mini = MAX;
//Calls the function
cal(n, mini);
//Prints the best result
cout << mini << endl;
return 0;
}
void cal(int inp, int &mini, int counter)
{
//Breaks recursion if it finds an answer
if(!inp)
{
if(counter<mini) mini = counter;
return;
}
//Breaks recursion if the input is negative
//or the counter is more than the best result
else if((inp<0) || (counter>mini)) return;
//Counts amount of recursions
counter++;
//Tries every combination
cal(inp-13, mini, counter);
cal(inp-6, mini, counter);
cal(inp-2, mini, counter);
cal(inp-1, mini, counter);
return;
}
谢谢
【问题讨论】:
-
循环几乎总是比递归快。
-
性能问题不是因为递归。这是因为你的蛮力算法。
-
您需要渐近更好的算法,而不是微优化。
-
不要使用递归。尽量减少函数调用/分支的数量。大多数处理器可以比分支指令更快地处理数据和移动指令。分支可能会导致处理器清空其指令流水线并重新加载或通过分支预测算法。无论哪种情况,这都是处理器可以用于其他目的的时间。所以,尽量减少递归调用。
标签: c++ function recursion optimization