#c #recursion
#c #рекурсия
Вопрос:
У меня возникли некоторые проблемы с этой функцией. Функция принимает a и рекурсивно вычисляет его до степени b. Мой компилятор выдает мне ошибку сегментации при компиляции, которую я не уверен, как исправить. Кто-нибудь может помочь?
/**** Recursive power function > Computes a^b, where b can be positive or negative*****/
int recPower(double a, int b)
{
if (b == 0)
{
return 1;
}
else
{
return (a *recPower(a, b-1));
}
}
/* Computes a^b (power function) */
cout << "POWER" << endl;
cout << "----------" << endl;
int a = 2, b = -3;
cout << a << "^" << b << " = ";
cout << recPower(a, b) << endl;
cout << endl;
Комментарии:
1.
return (a *recPower(a, b-1));
Это не сработает, еслиb
значение отрицательное. Попробуйте это на бумаге, чтобы понять, почему.2. Если при попытке компиляции вы получаете ошибку сегментации, это указывает на ошибку компилятора. Возможно, вы имели в виду, что при попытке запустить скомпилированную программу вы получаете ошибку сегментации?
Ответ №1:
Сбой является результатом бесконечной рекурсии. b
никогда не достигает 0, поскольку вы продолжаете уменьшать его на каждом рекурсивном шаге.
Вероятно, вам нужно вставить это предложение в свой код:
if (b < 0)
{
return 1.0 / recPower(a,-b);
}
else if (b == 0)
...
Конечно, a в степени отрицательного числа, скорее всего, будет значением от 0 до 1, что трудно точно отразить, если ваш возвращаемый тип — int . Это упражнение, оставленное вам для согласования. recPower
вероятно, следует возвращать тип double, если входной параметр равен double .
Ответ №2:
Как прокомментировал divx, проблема в том, что ваша функция плохо работает с отрицательными экспонентами: она входит в бесконечную рекурсию (не совсем бесконечную, но она вызывает переполнение стека).
Другое дело, что если база равна double
или вы хотите обработать отрицательные показатели, то функция должна возвращать a double
.
Это сделает работу:
double recPower(double a, int b)
{
if (b < 0)
{
return 1.0/recPower(a, -b);
}
else if (b == 0)
{
return 1;
}
return (a *recPower(a, b-1));
}
Вывод для вашего примера:
POWER
----------
2^-3 = 0.125