Toribash Русский Форум

Объявление

4бб переехал на toribash.ru. Все разделы 4бб закрыты на добавление сообщений.

Если вы были зарегестрированы на 4бб, в ваших личных сообщениях лежит пароль от одноименного аккаунта на toribash.ru.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Toribash Русский Форум » Гайд-парк » программирование на turbo pascal


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

Сообщений 1 страница 22 из 22

1

помогите сделать программу возведения заданного числа в заданную степень с помощью рекурсии

0

2

Код:
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;

+1

3

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

+1

4

Mariacho
Это не я делал, мне лень.

0

5

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

0

6

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

0

7

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.

На работоспособность не проверял, возможны ошибки.

0

8

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

0

9

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

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

0

10

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)

0

11

Plintus написал(а):

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

верно

0

12

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

0

13

Дарт
ему рекурсией надо =\

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

Отредактировано Mariacho (04.03.2011 15:08:53)

+1

14

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

+1

15

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;

Если это не рекурсия то тогда что рекурсия ?

Отредактировано Niew (04.03.2011 16:14:07)

0

16

Niew

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;

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

+1

17

Mariacho написал(а):

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

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

Отредактировано Niew (04.03.2011 16:16:28)

0

18

Niew
ну я уже ее выложил, но

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)

+1

19

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

inc (i);

Отредактировано ego22 (04.03.2011 22:12:46)

0

20

ego22
inc - это инкриминтировать расшифровывается;
используется для увеличения числа, стандартно inc(i) - означает  i+1, т.е. вместо этого можно было написать i:=i+1 (более привычный вид)

вообще, это довольно удобная функция, можно задать на сколько ты хочешь увеличить, например inc(i,3) - как думаю ты уже понял i:=i+3.. ну и дальше по аналогии.

зы: обратная команда, dec(i) уменьшает.

0

21

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

0

22

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

i по сути дела самый обычный счетчик;
изначально 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;

это ключевые строки;

даже не знаю.. понятно ли я объяснил.. могу чуток преобразовать программу, чтобы она выводила каждый шаг все значения переменных, чтобы
ты мог отследить изменения i

Отредактировано Mariacho (04.03.2011 22:46:10)

0


Вы здесь » Toribash Русский Форум » Гайд-парк » программирование на turbo pascal