1

Тема: программирование на turbo pascal

помогите сделать программу возведения заданного числа в заданную степень [color=fuchsia]с помощью рекурсии[/color]



2

Re: программирование на turbo pascal

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;


3

Re: программирование на turbo pascal

[b]Plintus[/b]
мутно как-то %)
я бы по другому сделал)

http://img.klavogonki.ru/userbar/ub4-204995.gif


4

Re: программирование на turbo pascal

[b]Mariacho[/b]
Это не я делал, мне лень.



5

Re: программирование на turbo pascal

[b]Plintus[/b]
не, я тож сам гуглил, ето не то. тут нет рекурсии D:



6

Re: программирование на turbo pascal

Как можно что-то сделать непрекращаемым циклом?

[center]http://img8.imageshack.us/img8/7126/131213721791.png[/center]


7

Re: программирование на turbo pascal

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.
На работоспособность не проверял, возможны ошибки.

[23.08.2012 0:01:24] NtS: И вот люблю фоткаться
[23.08.2012 0:01:31] NtS: Во всяких эротических журналах.
[23.08.2012 0:02:41] NtS: Я тоже хочу быть предметом обажания многих мужчин.


8

Re: программирование на turbo pascal

[b]ego22[/b]
Рекурсия это функция, вызывающая сама себя, верно?



9

Re: программирование на turbo pascal

Просто умножать число на само себя определенное количество раз?
Рекурсия тут конечно весьма отдаленно прослеживается =)



10

Re: программирование на turbo pascal

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;
Я на паскале давно не того, так что могу и попутать.
Как вызвать процедурку думаю разберёшься.



11

Re: программирование на turbo pascal

Plintus пишет:

ego22
Рекурсия это функция, вызывающая сама себя, верно?

верно



12

Re: программирование на turbo pascal

В чём проблема создать цикл, в котором число умножается само на себя?

http://fc02.deviantart.net/fs70/f/2012/044/b/2/fluttershy_sig_by_vinnieofsiftheads21-d4nyxke.png


13

Re: программирование на turbo pascal

[b]Дарт[/b]
ему рекурсией надо =\
зы: сижу над задачей.. вспоминаю как делается рекурсия =D

http://img.klavogonki.ru/userbar/ub4-204995.gif


14

Re: программирование на turbo pascal

сори за дабл,
[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.

могу пояснить.. если непонятно

http://img.klavogonki.ru/userbar/ub4-204995.gif


15

Re: программирование на turbo pascal

ego22 пишет:

верно

Хм... а я вроде как рекурсию вам и дал ну только деление через мод див надо делать - я на сях пишу дано уже просто .
провеняем 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;
Если это не рекурсия то тогда что рекурсия ?



16

Re: программирование на turbo pascal

[b]Niew[/b]

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;

это не паскаль =\

http://img.klavogonki.ru/userbar/ub4-204995.gif


17

Re: программирование на turbo pascal

Mariacho пишет:

это не паскаль =\

Это алгоритм - что я буду писать что ли всё с бигинами эндами и врайтлайнами ) я там выше разобрал кое что.... самим тож надо думать ... на самом деле лень качать турбопаскаля раде одной простой задачки вам.



18

Re: программирование на turbo pascal

[b]Niew[/b]
ну я уже ее выложил, но

Niew пишет:

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;

подчеркнутого в паскале как бы нет @_@
что-то можно ввести, например типы переменных, но тут явно паскалем не пахнет

http://img.klavogonki.ru/userbar/ub4-204995.gif


19

Re: программирование на turbo pascal

[b]Mariacho[/b]
все работает спасибо. поставил пять плюсов
только поясни это:

inc (i);



20

Re: программирование на turbo pascal

[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) уменьшает.

http://img.klavogonki.ru/userbar/ub4-204995.gif


21

Re: программирование на turbo pascal

[b]Mariacho[/b]
а чему равно i изначально и после? и для чего ето надо?



22

Re: программирование на turbo pascal

[b]ego22[/b]
ну.. вся рекурсия это один большой цикл, в котором [b]i[/b] играет ключевую роль.
Вообще, делать рекурсией не очень выгодно, ибо он СТЕПЕНЬ-1 раз прокручивает в холостую.
[b]i[/b] по сути дела самый обычный счетчик;
изначально i:=1 (задаю в первой строке головной программы), в конце i=СТЕПЕНЬ;

Mariacho пишет:

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]

http://img.klavogonki.ru/userbar/ub4-204995.gif