IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> рекурсионная возведение в степень, некак неполучается рекурсией
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


Иногда нужна пользоватся экономическим возведением в какуето степень. Чтобы использовать как менше множетелей операций функции надо использовать эти примечание
Прикрепленное изображение
в скобках написано b четное число
Написать программу которая реализировала экономочный число возведение в степень (с клавиатуры вводим натуральные числа n и m (0 < n ≤ 5, 0 < m ≤ 10), а на экране выводим n число в степени m). Нахождения степени должно быть выражено через рекурсированную функцию.

Я написал программу простую с возведением в степень с процедурой и экономичным или экономическим вариантом но без рекурсии

Program ekokel;
var n,m,a:longint;
procedure kel(n,m:integer);
begin
a:=1;
while m>0 do
begin
a:=a*n;
dec(m);
end;
end;
begin
writeln('введите число n от 0 до 5');
readln(n);
writeln('введите число m от 0 до 10');
readln(m);
if m mod 2 = 0 then begin
kel(n, m div 2);
a:=a*a
end
else kel(n,m);
writeln(a);
readln
end.



а с рекурсированной функцией получается неправильно

Program ekokel;
var n,m,a:longint;
function kel(n,m:integer):integer;
begin
if m>0 then begin n:=n*n; writeln('n= ',n); kel(n,m div 2); end;
end;
begin
writeln('введите число n от 0 до 5');
readln(n);
writeln('введите число m от 0 до 10');
readln(m);
if m mod 2 = 0 then begin
kel(n, m div 2);
a:=a*a
end
else kel(n,m);
writeln(a);
readln
end.


может подскажете как надо делать


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Program ekokel;

function kel(n, m: longint): longint;
begin
if m = 1 then kel := n
else
kel := sqr(n) * kel(n, m - 2);
end;

var n,m,a:longint;

begin
writeln('введите число n от 0 до 5'); readln(n);
writeln('введите число m от 0 до 10'); readln(m);

writeln(kel(n, m));
{ или }
{ a := kel(n, m); writeln(a); }
readln
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


А что, возводить надо только в нечётную степень?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


если степень четная, то используем этот примечание,если степень нечетное, точда используем простой подсчет

Сообщение отредактировано: maksimla -


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Нет тут никакого переполнения:
function kel(n, m: longint): longint;
begin
if m = 0 then kel := 1
else
if m = 1 then kel := n
else
kel := sqr(n) * kel(n, m - 2);
end;
, проверил со всеми передаваемыми значениями. Если число МОЖЕТ быть вычислено, и помещается в тип LongInt, выдается правильный результат.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Знаток
****

Группа: Пользователи
Сообщений: 324
Пол: Мужской
Реальное имя: maksim

Репутация: -  1  +


ясно спасибо но я немогу понять этого
 if m = 0 then kel := 1

при воде 2 и 4 то тогда эта будит
kel := 1
но чегото ответ получается правильный непонятно

Сообщение отредактировано: maksimla -


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
но чегото ответ получается правильный непонятно
На то она и рекурсия, чтобы не вычислять ответ сразу, а "собирать" его из кирпичиков, вычисленных на разных этапах.

Смотри: N = 3, M = 4
сразу после вызова: M = 0? Нет... M = 1? Нет... Значит, идем по третьей ветке, рекурсивно вызываем kel(N, M - 2), в нашем случае kel(3, 2)... А потом, когда вернемся сюда - т.е., когда на каком-то витке рекурсии будет M = 0 или M = 1, и рекурсия начнет раскручиваться назад - результат, который она вернет, будет домножен на Sqr(n), то есть на N*N...

Кстати, та моя реализация - не самая эффективная: для того, чтобы вычислить 310, надо 6 уровней рекурсии (чтобы проверить - можно сделать так:
function kel(n, m: longint): longint;
begin
writeln('*');
if m = 0 then kel := 1
else
if m = 1 then kel := n
else
kel := sqr(n) * kel(n, m - 2);
end;
, и посчитать, сколько звездочек будет напечатано, каждая звездочка - новый уровень рекурсии).

Вот такое решение:
function kel(n, m: longint): longint;
begin
writeln('*');
if (n = 0) or (m = 0) then kel := 1
else
if m = 1 then kel := n
else
kel := sqr(kel(n, m div 2)) * succ((m mod 2)*pred(n));
end;

для вычисления 310 "забирается" всего на 4-ый уровень, то есть, более эффективно работает.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 12:33
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name