задачи с рекурсиями на Pascal

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

kataklysm
Сообщения: 6
Зарегистрирован: 19 май 2006, 09:52

Помогите. Нужно составить программы с использованием рекурсии на Pascal.

1. Найти сумму первых N членов арифметической (геометрической) прогрессии.

2. Определить, является ли заданное натуральное число простым.

3. Для заданного натурального числа N>=1 опрделить, единственное натуральное число a, для которого выполняется неравенство: 2е(а-1)<=N<=2 в степени а
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

Арифметическая прогрессия. A-нулевой элемент, D-разность прогрессии,N-количество элементов

Код: Выделить всё

function Arifm (A,D,N: Integer): Integer;
begin
  if N=0 then
    Arifm := 0
  else
    Arifm := A+D*N+Arifm(A,D,N-1);
end;
Геометрическая прогрессия. A-нулевой элемент,Q-основание, N-количество элементов

Код: Выделить всё

function power (base,pow: Integer): Integer;
begin
  power := Round(exp(pow*ln(base)));
end;

function Geom (A,Q,N: Integer): Integer;
begin
  if N=0 then
    Geom := A
  else
    Geom := A*power(Q,N)+Geom(A,Q,N-1);
end;
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

Является ли простым (делится без остатка только на себя и 1) (IsSimple(число)):

Код: Выделить всё

function IsSmp (A,B: Integer): Boolean;
begin
  if B<=1 then
    exit;
  IsSmp := ((A mod B)<>0) and IsSmp (A,B-1);
end;

function IsSimple (Numb: Integer): Boolean;
begin
  IsSimple := IsSmp (Numb,Numb-1);
end;
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

Уточни последнее задание
kataklysm
Сообщения: 6
Зарегистрирован: 19 май 2006, 09:52

2 Vunder Огромное спасибо.

3. Для заданного натурального числа N>=1 определить, единственное натуральное число a, для которого выполняется неравенство: (2 в степени(а-1)) <= N <(2 в степени а)

Еще если не трудно хотелось бы увидить код вот такой программки:
Составить рекурсивную программу ввода с клавиатуры последовательности чисел (окончание ввода - 0) и вывода на экран в обратном порядке.
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

Составить рекурсивную программу ввода с клавиатуры последовательности чисел (окончание ввода - 0) и вывода на экран в обратном порядке.
:

Код: Выделить всё

procedure Enter (N: Integer);
var
  k: Integer;
begin
  if N=0 then
    exit
  else
    begin
      ReadLn (k);
      Enter(k);
      if N>0 then
        WriteLn (N);
    end;
end;
Для старта можно так: Enter(-1);
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

3. Для заданного натурального числа N>=1 определить, единственное натуральное число a, для которого выполняется неравенство: (2 в степени(а-1)) <= N <(2 в степени а)

Код: Выделить всё

function power2 (pwr: Integer): Integer;
begin
  power2 := Round(exp(pwr*ln(2)));
end;

function a_ (N,a: Integer): Integer;
begin
  if (N>=power2(a-1)) and (N<power2(a)) then
    a_ := a
  else
    a_ := a_(N,a+1);
end;

function abc (N: Integer): Integer;
begin
  abc := a_(N,1);
end;
Для расчета: abc(N)
kataklysm
Сообщения: 6
Зарегистрирован: 19 май 2006, 09:52

2 vunder Работает! Благодарю.

вот последняя задачка: Функция F(n) определена для целых положительных чисел следующим образом:
F(n)=1, при n=1
F(n)= сумма от i=2 до n F(n div i) , если n>2
Вычислить значения этой функции для n=5,6,7,...,20.



и еще посмотри эту рекурсию:

Код: Выделить всё

function Acc(n,m:word):word;
begin
  If (n=0) then Acc:=m+1
   else
     begin
       If (n<>0) and (m=0) then Acc:=Acc(n-1,1);
       If (n<>0) and (m<>0) then Acc:=Acc(n-1,Acc(n,m-1));
     end;
end;
При некоторых значениях пишет, что stack overflow error. Например при n=9 и m=3. Это функция Аккермана.
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

Код: Выделить всё

function F(n: Integer): Integer;
var
  r,i: Integer;
begin
  if n<=0 then
    F := 0
  else if n=1 then
    F := 1
  else
    begin
      r := 0;
      for i := 2 to n do
        r := r+F(n div i);
      F := r;
    end;
end;

Код: Выделить всё

Acc(n-1,Acc(n,m-1))
- вот, где ошибка.
kataklysm
Сообщения: 6
Зарегистрирован: 19 май 2006, 09:52

Функция Аккермана так описывается.
A(n,m)=m+1, если n=0
A(n,m)=A(n-1,1), если n<>0, m=0
A(n,m)=A(n-1,A(n,m-1)), если n>0, m>=0
Ответить