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

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

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

 
 Ответить  Открыть новую тему 
> рекурсионная возведение в степень, некак неполучается рекурсией
maksimla
сообщение 7.11.2009 18:24
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2009 18:46
Сообщение #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.
 К началу страницы 
+ Ответить 
TarasBer
сообщение 7.11.2009 18:56
Сообщение #3


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

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

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


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


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


Знаток
****

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

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


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

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


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2009 19:11
Сообщение #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, выдается правильный результат.
 К началу страницы 
+ Ответить 
maksimla
сообщение 7.11.2009 19:49
Сообщение #6


Знаток
****

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

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


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

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

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


--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2009 20:16
Сообщение #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

 



- Текстовая версия 28.04.2024 10:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"