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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Исправить код http://www.cyberforum.ru/cpp-beginners/thread1125788.html
Исправлял код и не могу исправить выделенное(в коде). Помогите чем-нибудь заменить данные строки(сделать более просто без iFile). В самом низу изначальный код. #include "conio.h" #include...
C++ Сведение о программе написанной на с++ Искала по форуму, поиск находит что попало, но не то что нужно: нужно в VS 2008 установить для программы: file version product version product name copyright file description http://www.cyberforum.ru/cpp-beginners/thread1125753.html
Увеличение и уменьшение "Квадрата" афтоматически C++
Выкладываю готовый код (возможно кому то пригодится) Задание : Решить предыдущую задачу, только размеры должны изменятся афтоамтически через 1 секунду. Нажатие на левую кнопку мыши меняет...
C++ Снова try catch
Доброе утро всем!:) Недавно спрашивала как работать с блоками try ... catch. В общем, прозрение так и не пришло, но доделать код хочется. Вот сделала пока такую штуку int_array::int_array(int n) {...
C++ Задание из Страуструпа http://www.cyberforum.ru/cpp-beginners/thread1125705.html
Добрый день. При изучении С++ по учебники Страуструпа столкнулся со следующим заданием : "Дайте пользователю возможность определять функции в настольном калькуляторе. Подсказка: определяйте функции...
C++ Файлы и записи c++ Составить программу, выводящую на экран анкетные данные учеников (Ф. И. О., год рождения, адрес, сведения о родителях). Распечатать данные об учениках, родившихся ранее заданного года. мы вводим в... подробнее

Показать сообщение отдельно
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.03.2014, 14:53
Цитата Сообщение от Игорюня Посмотреть сообщение
Но до моей тупой коробки не может дойти то,как указать,чтобы рекурсия вызывалась конкретное число раз.
Во-первых нафига? А во-вторых это будет не рекурсия, а явный цикл, да ещё и со счётчиком. Рекурсия всегда работает до условия на значение параметра: выделяется значение параметра, к которому он стремится в последовательности рекурсивных вызовов и для которого функция должна вернуть результат не рекурсивно. Для степени это просто: не рекурсивно можно вернуть единицу при нулевом показателе. Отсюда решение: разложить показатель на сумму слагаемых и для каждое слагаемое использовать в качестве значения показателя для следующего вызова. Можно фиксировать одно слагаемое, приняв его единичным, или делить примерно поровну.
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru