помогите сделать программу возведения заданного числа в заданную степень с помощью рекурсии
программирование на turbo pascal
Сообщений 1 страница 22 из 22
Поделиться203.03.2011 21:26:35
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;
Поделиться303.03.2011 21:52:01
Plintus
мутно как-то %)
я бы по другому сделал)
Поделиться403.03.2011 21:53:22
Mariacho
Это не я делал, мне лень.
Поделиться503.03.2011 22:31:32
Plintus
не, я тож сам гуглил, ето не то. тут нет рекурсии D:
Поделиться603.03.2011 22:43:08
Как можно что-то сделать непрекращаемым циклом?
Поделиться703.03.2011 22:56:33
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.
На работоспособность не проверял, возможны ошибки.
Поделиться803.03.2011 23:03:34
ego22
Рекурсия это функция, вызывающая сама себя, верно?
Поделиться904.03.2011 00:50:32
Просто умножать число на само себя определенное количество раз?
Рекурсия тут конечно весьма отдаленно прослеживается =)
Поделиться1004.03.2011 03:48:15
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;
Я на паскале давно не того, так что могу и попутать.
Как вызвать процедурку думаю разберёшься.
Отредактировано Niew (04.03.2011 03:50:22)
Поделиться1104.03.2011 13:26:48
ego22
Рекурсия это функция, вызывающая сама себя, верно?
верно
Поделиться1204.03.2011 14:27:08
В чём проблема создать цикл, в котором число умножается само на себя?
Поделиться1304.03.2011 14:40:50
Дарт
ему рекурсией надо =\
зы: сижу над задачей.. вспоминаю как делается рекурсия =D
Отредактировано Mariacho (04.03.2011 15:08:53)
Поделиться1404.03.2011 15:43:43
сори за дабл,
ego22
бро, с тебя большущий пирожок, ибо долго просидел =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.
могу пояснить.. если непонятно
Отредактировано Mariacho (04.03.2011 15:57:45)
Поделиться1504.03.2011 15:53:36
верно
Хм... а я вроде как рекурсию вам и дал ну только деление через мод див надо делать - я на сях пишу дано уже просто .
провеняем 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;
Если это не рекурсия то тогда что рекурсия ?
Отредактировано Niew (04.03.2011 16:14:07)
Поделиться1604.03.2011 15:56:38
Niew
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;
это не паскаль =\
Поделиться1704.03.2011 16:15:35
это не паскаль =\
Это алгоритм - что я буду писать что ли всё с бигинами эндами и врайтлайнами ) я там выше разобрал кое что.... самим тож надо думать ... на самом деле лень качать турбопаскаля раде одной простой задачки вам.
Отредактировано Niew (04.03.2011 16:16:28)
Поделиться1804.03.2011 16:48:32
Niew
ну я уже ее выложил, но
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;
подчеркнутого в паскале как бы нет @_@
что-то можно ввести, например типы переменных, но тут явно паскалем не пахнет
Отредактировано Mariacho (04.03.2011 16:50:20)
Поделиться1904.03.2011 22:10:58
Mariacho
все работает спасибо. поставил пять плюсов
только поясни это:
inc (i);
Отредактировано ego22 (04.03.2011 22:12:46)
Поделиться2004.03.2011 22:17:30
ego22
inc - это инкриминтировать расшифровывается;
используется для увеличения числа, стандартно inc(i) - означает i+1, т.е. вместо этого можно было написать i:=i+1 (более привычный вид)
вообще, это довольно удобная функция, можно задать на сколько ты хочешь увеличить, например inc(i,3) - как думаю ты уже понял i:=i+3.. ну и дальше по аналогии.
зы: обратная команда, dec(i) уменьшает.
Поделиться2104.03.2011 22:24:48
Mariacho
а чему равно i изначально и после? и для чего ето надо?
Поделиться2204.03.2011 22:44:32
ego22
ну.. вся рекурсия это один большой цикл, в котором i играет ключевую роль.
Вообще, делать рекурсией не очень выгодно, ибо он СТЕПЕНЬ-1 раз прокручивает в холостую.
i по сути дела самый обычный счетчик;
изначально 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;
это ключевые строки;
даже не знаю.. понятно ли я объяснил.. могу чуток преобразовать программу, чтобы она выводила каждый шаг все значения переменных, чтобы
ты мог отследить изменения i
Отредактировано Mariacho (04.03.2011 22:46:10)