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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
21.03.2014, 14:29     Рекурсивное возведение в степень числа #1
Рекурсивная функция,которая принимает 2 параметра:первый-число,второй-степень в которую нужно возвести число.Всё просто.Но до моей тупой коробки не может дойти то,как указать,чтобы рекурсия вызывалась конкретное число раз.
function(2,3);
Рекурсия должна вызываться два раза: 2*2=4, 4*2=8. Вот не могу понять,как указать количество рекурсий.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 14:29     Рекурсивное возведение в степень числа
Посмотрите здесь:

C++ Возведение числа n в степень m.
C++ рекурсивное возведение в степень
C++ Возведение числа в степень
C++ Возведение числа в целую степень
C++ Рекурсивное возведение в степень
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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;
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
21.03.2014, 14:42     Рекурсивное возведение в степень числа #3
C++
1
std::cout << RecursivePow(2, -1) << std::endl;
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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);
}
. Но эффективней бинарное разложение.
Yandex
Объявления
21.03.2014, 14:53     Рекурсивное возведение в степень числа
Ответ Создать тему
Опции темы

Текущее время: 19:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru