Я создаю программу, которая возвращает наименьшее количество сумм, необходимых для получения числа (n), используя только 1, 2, 6 и 13. Он отлично работает при малых значениях 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;
}
Спасибо
Петля почти всегда будет быстрее, чем рекурсия. – freakish
Проблема с производительностью не из-за рекурсии. Это из-за вашего алгоритма грубой силы. –
Вам нужен асимптотически лучший алгоритм, а не микрооптимизации. –