Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
#1

Рекурсивное возведение в степень числа - C++

21.03.2014, 14:29. Просмотров 1905. Ответов 3
Метки нет (Все метки)

Рекурсивная функция,которая принимает 2 параметра:первый-число,второй-степень в которую нужно возвести число.Всё просто.Но до моей тупой коробки не может дойти то,как указать,чтобы рекурсия вызывалась конкретное число раз.
function(2,3);
Рекурсия должна вызываться два раза: 2*2=4, 4*2=8. Вот не могу понять,как указать количество рекурсий.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 14:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивное возведение в степень числа (C++):

Рекурсивное возведение в степень - C++
ребят, нужна задача... рекурсивное возведение в base степень exponent: stepen(int base, int exponent)

Рекурсивное возведение в степень - C++
Поднести в степень (положительное целое число) действительное ненулевое число. Использовать рекурсию.

Рекурсивное возведение в степень - C++
Составить программу вычисления функции F(x) = xn.

Возведение из числа степень - C++
Прошу помочь. Вводим любое число n и надо возвести её степень. (притом, должно быть или 2 в степени x, или 3) Например: n=81 >> 3 в...

Возведение числа в степень - C++
Помогите написать программу, возводящщую число M в степень N (-10<M<10, 0<N<10 - проверить выполнение данных условий)

Возведение числа n в степень m. - C++
Написать программу - возведение числа n в m-ю степень. Входные данные поступают с клавиатуры. Результат выводится на экран.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,026
21.03.2014, 14:38 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int RecursivePow(int base, int power)
{
    return power == 1 ? base : base * RecursivePow(base, power - 1);
}
 
int main()
{
    std::cout << RecursivePow(2, 3) << std::endl;
    return 0;
}
2
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
21.03.2014, 14:42 #3
C++
1
std::cout << RecursivePow(2, -1) << std::endl;
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.03.2014, 14:53 #4
Цитата Сообщение от Игорюня Посмотреть сообщение
Но до моей тупой коробки не может дойти то,как указать,чтобы рекурсия вызывалась конкретное число раз.
Во-первых нафига? А во-вторых это будет не рекурсия, а явный цикл, да ещё и со счётчиком. Рекурсия всегда работает до условия на значение параметра: выделяется значение параметра, к которому он стремится в последовательности рекурсивных вызовов и для которого функция должна вернуть результат не рекурсивно. Для степени это просто: не рекурсивно можно вернуть единицу при нулевом показателе. Отсюда решение: разложить показатель на сумму слагаемых и для каждое слагаемое использовать в качестве значения показателя для следующего вызова. Можно фиксировать одно слагаемое, приняв его единичным, или делить примерно поровну.
C++
1
2
3
4
5
6
7
8
9
10
11
12
double degree(double a, int n)
{
 if (n<0)
 {
  return 1.0/degree(a, -n);
 }
 if (n==0)
 {
  return 1.0;
 }
 return a*degree(a, n-1);
}
, здесь подразумевается, что http://www.cyberforum.ru/cgi-bin/latex.cgi?a^1=a, но такая степень не вычисляется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
double degree(double a, int n)
{
 if (n<0)
 {
  return 1.0/degree(a, -n);
 }
 if (n==0)
 {
  return 1.0;
 }
 return degree(a, 1)*degree(a, n-1);
}
, здесь вычисляются обе степени, но так делать нельзя, так как из каждого экземпляра вызовется degree(a, 1), из которого снова будет аналогичный вызов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
double degree(double a, int n)
{
 int leftn;
 if (n<0)
 {
  return 1.0/degree(a, -n);
 }
 if (n==0)
 {
  return 1.0;
 }
 return degree(a, leftn=n/2)*degree(a, n-leftn);
}
, можно было бы присвоить
C++
1
x=degree(a, n/2);
и вернуть
C++
1
return x*x;
, но вот беда: при нечётном n два слагаемых не могут быть равны.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
double degree(double a, int n)
{
 double x;
 if (n<0)
 {
  return 1.0/degree(a, -n);
 }
 if (n==0)
 {
  return 1.0;
 }
 x=degree(a, n/2);
 if ((n%2)==0)
 {
  return x*x;
 }
 return x*x*a;
}
, здесь нечётные показатели раскладываются на три слагаемых каждый, из которых один равен единице.

Добавлено через 3 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
C++
1
2
3
4
int RecursivePow(int base, int power)
{
 return power == 1 ? base : base * RecursivePow(base, power - 1);
}
не правильно: при нулевом и отрицательном показателе будет переполнение стека формально бесконечной рекурсией. Уж хотябы
C++
1
2
3
4
int RecursivePow(int base, unsigned int power)
{
 return power == 0 ? 1 : base * RecursivePow(base, power - 1);
}
. Но эффективней бинарное разложение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2014, 14:53
Привет! Вот еще темы с ответами:

Возведение числа а в степень n - C++
Возведение числа а в степень n ,задача не проста чем , 1&lt;=а&lt;=10 | 1&lt;=n&lt;=7000 Степень может быть 7000 , и тут у меня возникли трудности ,...

Возведение числа в степень n-1 - C++
Есть формула {(-1)}^{n-1}*{3}^{n-1} , n увеличивается циклом на 1. Как записать числа в степень n-1 без пользов. и стандартных функций??...

Возведение числа в целую степень - C++
Задачка из методички моего вуза. Даны действительные числа a1,…,a10. Вычислить a1+(a2)^2+…+(a10)^2, используя подпрограмму возведения числа...

Рекурсия, возведение числа в степень - C++
подскажите плис как возвести число в степень через перемножение чисел. с помощью рекурсии. число и степень вводятся в ручную думаю...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.03.2014, 14:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru