Рекурсивная функция мощности в C

#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