Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 24
1

Рекурсивная функция возведения в степень

23.02.2015, 15:19. Показов 1790. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мое задание: Вычислить y = x^n(икс в степени n) по следующему правилу: y = ( x^n/2 )^2, если n четное и y = x * y^(n–1), если n нечетное. Без рекурсии я сделал, а как с рекурсией? Я понятия не имею, помогите пожалуйста.Чего в интернете только не прочитал, все про факториал, а в моем примере не могу, хоть убейте.
Сам пишу в оконном, но можно и в консоли. Я пойму. Вот мой кусочек кода без рекурсии:
C++
1
2
3
4
5
6
7
8
double Fun(int n, double x)  {
double y;
if(n%2==0)
y=x*pow(x,n-1); // думал, что ошибка в условии. Заменил y из условия на x.
else
y=pow(pow(x,n/2),2);
return y;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2015, 15:19
Ответы с готовыми решениями:

Рекурсивная функция возведения в степень
Ребята, написал функцию для возведения в степень из учебника, но она почему-то не хочет работать....

Функция возведения в степень
В школе изучаем C++ и я её не понимаю. Требуется написать функцию long long pow(long long a,...

Функция возведения в степень.
написал библиотеку для вычисления степени чисел.некорректно работает при возвращении переменной из...

Функция возведения в степень
Добрый день. Ребята, помогите решить проблему. Написал функцию для вычисления действительных...

9
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
23.02.2015, 15:24 2
C++
1
2
3
4
5
6
double pow(double x, int n)
{if(n==0) return 1;
 if(n==1) return x;
 if(n&1) return x*pow(x,n/2)*pow(n/2);
 else return pow(x,n/2)*pow(n/2);
}
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
23.02.2015, 15:31 3
saden, а так не более читаемо?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double pow(double x, int n)
{
    double result;
    if(n==0)
        result = 1;
    if(n==1)
        result = x;
    if(n&1)
        result = x*pow(x,n/2)*pow(n/2);
    else
        result = pow(x,n/2)*pow(n/2);
 
    return result;
}
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
23.02.2015, 15:34 4
Цитата Сообщение от saden Посмотреть сообщение
double pow(double x, int n)
как это стыкуется, с этим
Цитата Сообщение от gru74ik Посмотреть сообщение
pow(n/2)
0
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
23.02.2015, 15:36 5
gru74ik, на вкус и цвет... Лишняя переменная в пользу, возможно, читаемости... Тут можно предложить не двойной вызов pow(x,n/2)*pow(n/2), а одинарный через переменную y=pow(x,n/2); return y*y

Добавлено через 45 секунд
ValeryS, ну тарапился... Чего непонятного-то...
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
23.02.2015, 15:36 6
Цитата Сообщение от saden Посмотреть сообщение
pow(n/2)
А это что такое?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double func(double x, int n) {
    switch (n) {
        case 0: return 1;
        case 1: return x;
        default:
            if (n%2) {
                return x * func(x, n-1);
            } else {
                double tmp = func(x, n/2);
                return tmp * tmp;
            }
    }
}
0
184 / 168 / 53
Регистрация: 27.01.2013
Сообщений: 788
23.02.2015, 15:40 7
Цитата Сообщение от Jewbacabra Посмотреть сообщение
return x * func(x, n-1);
А это что такое? Быстрее сразу делить на два

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
double pow_rec(double x, int n)
{if(n==0) return 1;
 if(n==1) return x;
 double y = pow_rec(x,n/2);
 if(n&1) return x*y*y;
 return y*y;
}
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,520
23.02.2015, 15:42 8
вот это лишнее
Цитата Сообщение от Jewbacabra Посмотреть сообщение
case 1: return x;
попадает в ветку
Цитата Сообщение от Fatallol Посмотреть сообщение
y = x * y^(n–1)
итого
C++
1
2
3
4
5
6
7
8
9
10
double func(double x, int n) {
   
        if(n== 0) return 1;
        if (n%2) {
                return x * func(x, n-1);
            } else {
                double tmp = func(x, n/2);
                return tmp * tmp;
            }
}
0
0 / 0 / 0
Регистрация: 17.10.2014
Сообщений: 24
23.02.2015, 18:18  [ТС] 9
Спасибо большое, очень помогли. Правда, приятно.
0
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
23.02.2015, 21:08 10
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
2
3
4
if(n==1)
    result = x;
if(n&1)
    result = x*pow(x,n/2)*pow(n/2)
В случае с n = 1 этот блок последовательно выполнится
0
23.02.2015, 21:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2015, 21:08
Помогаю со студенческими работами здесь

Функция возведения матрицы в степень
Просьба кто знает как такое реализовать напишите, уже сколько мучаюсь , а считает не правильно , мб...

Функция возведения в целую степень
как возвести в степень 2^3 + 5^3 через цикл for без функции Pow.

Не подключается функция возведения в степень pow
#include <math.h> L=sqrt(pow(x-x0)+pow(y-y0)); Почему не подключаеться ...

Функция возведения в степень с параметрами по умолчанию
Возведение числа n в степень р — это умножение числа n на себя р раз. Напишите функцию с именем...

Функция для возведения в степень (стыдно)
Здравствуйте. Нужно написать программу, которая читает два целых значения (основание и показатель...

Функция для сложного возведения в степень по формуле
Известно, что x,y,z - целые числа, которые могут принимать значения в диапазоне от 1 до 4...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru