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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Исправить код http://www.cyberforum.ru/cpp-beginners/thread1125788.html
Исправлял код и не могу исправить выделенное(в коде). Помогите чем-нибудь заменить данные строки(сделать более просто без iFile). В самом низу изначальный код. #include "conio.h" #include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; int main() {
C++ Сведение о программе написанной на с++ Искала по форуму, поиск находит что попало, но не то что нужно: нужно в VS 2008 установить для программы: file version product version product name copyright file description http://www.cyberforum.ru/cpp-beginners/thread1125753.html
Увеличение и уменьшение "Квадрата" афтоматически C++
Выкладываю готовый код (возможно кому то пригодится) Задание : Решить предыдущую задачу, только размеры должны изменятся афтоамтически через 1 секунду. Нажатие на левую кнопку мыши меняет направление изменения размеров. Права кнопка завершает работу Код программы: #include <Windows.h> #include <tchar.h>
C++ Снова try catch
Доброе утро всем!:) Недавно спрашивала как работать с блоками try ... catch. В общем, прозрение так и не пришло, но доделать код хочется. Вот сделала пока такую штуку int_array::int_array(int n) { try{ if (n < 0) throw "Cannot initialize array with negative count of elements!"; mas = new int; for (int i = 0; i < n; ++i)
C++ Задание из Страуструпа http://www.cyberforum.ru/cpp-beginners/thread1125705.html
Добрый день. При изучении С++ по учебники Страуструпа столкнулся со следующим заданием : "Дайте пользователю возможность определять функции в настольном калькуляторе. Подсказка: определяйте функции как последовательность действий, прямо так, как их набрал пользователь. Такую последовательность можно хранить или как символьную строку, или как список лексем. После этого, когда функция вызывается,...
C++ Файлы и записи c++ Составить программу, выводящую на экран анкетные данные учеников (Ф. И. О., год рождения, адрес, сведения о родителях). Распечатать данные об учениках, родившихся ранее заданного года. мы вводим в программе данные через структуру записываем их в новый файл а потом открываем этот файл еще раз и задам условие и исхдя из условия выводим учеников на экран подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 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);
}
. Но эффективней бинарное разложение.
 
Текущее время: 00:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru