Страница 1 из 2
задачи с рекурсиями на Pascal
Добавлено: 19 май 2006, 10:12
kataklysm
Помогите. Нужно составить программы с использованием рекурсии на Pascal.
1. Найти сумму первых N членов арифметической (геометрической) прогрессии.
2. Определить, является ли заданное натуральное число простым.
3. Для заданного натурального числа N>=1 опрделить, единственное натуральное число a, для которого выполняется неравенство: 2е(а-1)<=N<=2 в степени а
Добавлено: 19 май 2006, 14:06
vunder
Арифметическая прогрессия. 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;
Добавлено: 19 май 2006, 14:10
vunder
Является ли простым (делится без остатка только на себя и 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;
Добавлено: 19 май 2006, 14:44
vunder
Уточни последнее задание
Добавлено: 19 май 2006, 18:11
kataklysm
2 Vunder Огромное спасибо.
3. Для заданного натурального числа N>=1 определить, единственное натуральное число a, для которого выполняется неравенство: (2 в степени(а-1)) <= N <(2 в степени а)
Еще если не трудно хотелось бы увидить код вот такой программки:
Составить рекурсивную программу ввода с клавиатуры последовательности чисел (окончание ввода - 0) и вывода на экран в обратном порядке.
Добавлено: 19 май 2006, 21:02
vunder
Составить рекурсивную программу ввода с клавиатуры последовательности чисел (окончание ввода - 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);
Добавлено: 19 май 2006, 21:18
vunder
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)
Добавлено: 22 май 2006, 14:33
kataklysm
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. Это функция Аккермана.
Добавлено: 22 май 2006, 17:35
vunder
Код: Выделить всё
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;
- вот, где ошибка.
Добавлено: 22 май 2006, 17:47
kataklysm
Функция Аккермана так описывается.
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