Тема: программирование на turbo pascal
помогите сделать программу возведения заданного числа в заданную степень [color=fuchsia]с помощью рекурсии[/color]
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
toribash.ru → Гайд-парк → программирование на turbo pascal
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
помогите сделать программу возведения заданного числа в заданную степень [color=fuchsia]с помощью рекурсии[/color]
function power (x,pow:integer):integer;
var res: integer;
begin
res := 1;
while (pow > 0) do
begin
if (pow and 1 = 1) then res := res * x;
x := x + x;
pow := pow shr 1;
end;
power := res;
end;[b]Mariacho[/b]
Это не я делал, мне лень.
[b]Plintus[/b]
не, я тож сам гуглил, ето не то. тут нет рекурсии D:
Как можно что-то сделать непрекращаемым циклом?
[/center]var g,n,b,i:integer
BEGIN
b:=0;
read(g,n);
i:=g;
while (b<>(n-1)) do
begin
g:=g*i;
b:=b+1;
end;
writeln(g);
readln;
END.
На работоспособность не проверял, возможны ошибки.
[b]ego22[/b]
Рекурсия это функция, вызывающая сама себя, верно?
Просто умножать число на само себя определенное количество раз?
Рекурсия тут конечно весьма отдаленно прослеживается =)
function func(x:double,n:long):double;
begin
if(n == 0) return 1;
if(n < 0) return power ( 1 / x, -n);
if(n mod 2) return x * power (x, n - 1);
return power(x * x, n / 2);
end;
Я на паскале давно не того, так что могу и попутать.
Как вызвать процедурку думаю разберёшься.
ego22
Рекурсия это функция, вызывающая сама себя, верно?
верно
В чём проблема создать цикл, в котором число умножается само на себя?

сори за дабл,
[b]ego22[/b]
бро, с тебя большущий пирожок, ибо долго просидел =D
uses crt;
var otvet,a:integer; b,i:byte;
Procedure vozvedeniye (chisl:integer;step:byte);
var f:byte;
begin
f:=1;
otvet:=chisl;
if step=0 then otvet:=1;
if step>1 then begin
for f:=1 to i-1 do otvet:=otvet*chisl;
if i<step then begin
inc (i);
vozvedeniye (chisl,step);
end;
end;
end;
begin
i:=1;
writeln ('Vvedite chislo');
readln (a);
writeln ('Vvedite stepen');
readln (b);
Vozvedeniye (a,b);
writeln ('Otvet = ',otvet);
end.могу пояснить.. если непонятно
верно
Хм... а я вроде как рекурсию вам и дал ну только деление через мод див надо делать - я на сях пишу дано уже просто .
провеняем n - наша рекурсивная переменная степени
if(n == 0) return 1;
Если степень равна 0 = выдаёт еденицу ->геймовер ->выход
if(n < 0) return power ( 1 / x, -n);
Если степень отрицательна, то выводим->pow ( 1 mod x, n) (я непомню как в турбо уже функция степени выглядит)
и уменьшаем n на еденицу
if(n mod 2) return x * power (x, n - 1);
Если степень кратна двум умнажем Х на икс в спенени -1 ) (это чтобы значение икса не затереть)
return power(x * x, n / 2);
Мобщем читаем алгебру и алгоритм будет понятен )
end;
Если это не рекурсия то тогда что рекурсия ?
это не паскаль =\
Это алгоритм - что я буду писать что ли всё с бигинами эндами и врайтлайнами ) я там выше разобрал кое что.... самим тож надо думать ... на самом деле лень качать турбопаскаля раде одной простой задачки вам.
[b]Niew[/b]
ну я уже ее выложил, но
function func(x:[b]double,n:long):double[/b];
begin
[b] if(n == 0) [/b][b]return[/b] 1;
if(n < 0) [b]return power[/b] ( 1 / x, -n);
if(n mod 2) [b]return[/b] x * [b]power[/b] (x, n - 1);
[b]return power[/b](x * x, n / 2);
end;
подчеркнутого в паскале как бы нет @_@
что-то можно ввести, например типы переменных, но тут явно паскалем не пахнет
[b]Mariacho[/b]
все работает спасибо. поставил пять плюсов
только поясни это:
inc (i);
[b]ego22[/b]
inc - это инкриминтировать расшифровывается;
используется для увеличения числа, стандартно [b]inc(i)[/b] - означает i+1, т.е. вместо этого можно было написать [b]i:=i+1[/b] (более привычный вид)
вообще, это довольно удобная функция, можно задать на сколько ты хочешь увеличить, например [b]inc(i,3) [/b]- как думаю ты уже понял i:=i+3.. ну и дальше по аналогии.
зы: обратная команда, dec(i) уменьшает.
[b]Mariacho[/b]
а чему равно i изначально и после? и для чего ето надо?
[b]ego22[/b]
ну.. вся рекурсия это один большой цикл, в котором [b]i[/b] играет ключевую роль.
Вообще, делать рекурсией не очень выгодно, ибо он СТЕПЕНЬ-1 раз прокручивает в холостую.
[b]i[/b] по сути дела самый обычный счетчик;
изначально i:=1 (задаю в первой строке головной программы), в конце i=СТЕПЕНЬ;
if step>1 then begin for f:=1 to i-1 do otvet:=otvet*chisl; if i<step then begin inc (i); vozvedeniye (chisl,step); end;
это ключевые строки;
даже не знаю.. понятно ли я объяснил.. могу чуток преобразовать программу, чтобы она выводила каждый шаг все значения переменных, чтобы
ты мог отследить изменения [b]i[/b]
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
toribash.ru → Гайд-парк → программирование на turbo pascal
Форум работает на PunBB, при поддержке Informer Technologies, Inc
Сгенерировано за 0.028 секунды (68% PHP — 32% БД) 11 запросов к базе данных