@marlaaa

Рекурсия.По какой причине ответ всегда 0?

Описать рекурсивную функцию PowerN(X, N) вещественного типа, находящую значение N-й степени числа X по формулам:
X 0 = 1,
X N = (X N / 2)2 при четных N > 0,
X N = X·X N–1 при нечетных N > 0,
X N = 1/X –N при N < 0
(X ≠ 0 — вещественное число, N — целое; в формуле для четных N должна использоваться операция целочисленного деления). С помощью этой функции найти значения X N для данного X при пяти данных значениях N.
Мой код:
#include <iostream>
#include <cmath>
using namespace std;
float power(float X, int N){
    if (N != 0){
        if (N < 0){
            return 1 / power(X, -N);
            }
        else if(N>0){
            if (N % 2 == 0){
                float b=power(X, N/2);
                return pow(b,2);
                }
            else{
    
                return X * power(X, N - 1);
            }
        }
    else{
        return 1;
}
    }

}
int main(){
 float X;
 int N;
 cout<<"X=";
cin>>X;
for (int i=0;i<=5;i++){
    cout<<"N=";
    cin>>N;
    cout<<X<<"^"<<N<<"="<<power(X,N)<<endl;
}
}
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Аккуратно расставьте отступы. У вас там логика if else напутана, и программа делает совсем не то, что бы вам хотелось. Кроме того, посмотрите внимательно на warning-и от компилятора (он точно скажет, что power иногда не возвращает никаких значений, хотя вам кажется, что return есть во всех ветках if else). Это как раз потому, что у вас скобки не так расставлены и else относится совсем не к тому if, как вы хотели бы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Учитесь писать красиво. Вместо нагромождения вложенных if/else используйте ранний выход из функции.
float power(float X, int N) {
    if (N == 0) {
        return 1;
    }
    if (N < 0) {
        return 1. / power(X, -N);
    }
    if (N % 2 == 0) {
        float b = power(X, N / 2);
        return b * b;
    }
    return X * power(X, N - 1);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы