Рекурсия. Язык Си. Дано натуральное число n. Найти сумму первых n членов ряда чисел,
заданного рекуррентной формулой. Решить задачу тремя
(Написать три программы): 1) в программе использовать рекурсивную процедуру или функцию, которая выполняет вычисления и членов ряда, и суммы на рекурсивном спуске; 2) в программе использовать рекурсивную процедуру или функцию, выполняет исчисления и членов ряда, и суммы на рекурсивном возврате; 3) в программе использовать рекурсивную процедуру или функцию, выполняет вычисления членов ряда на рекурсивном спуске, а вычисления суммы на рекурсивном возвращении.
Программы должны работать корректно для произвольного
натурального n включая n = 1. Если что не поняли пиши в комментарии, я отвечу.
1) Сразу ясно, что невозможно, так как максимальное число, которое мы можем получить - это 81 (пермножается наибольшая цифра 9) 2) Здесь уже надо подумать. Из нашего условия видно, что второе число повторяется дважды и там и там. То есть эти два числа (в данном случае 35 и 56) будут иметь одинаковый множитель "второе число". На это и будем опираться. Посмотрим. 35 можно получить из произведения 5 на 7, а число 56 - из произведения 8 на 7. Заметим, что цифра 7 повторяется там и там, то бишь это и есть наша вторая цифра => может оказаться результатом работы автомата. 3) Здесь 32 можно получить, перемножив цифры 8 и 4, а 16 - 2 на 8. Повторяется 8 => может оказаться результатом работы автомата. 4) Делители 35 - это 5 и 7, у 72 - это 9 и 2^3 (8). Здесь уже нет общих делителей. (9 умножить на 2 не получиться, так как это уже будет не цифрой. Только 9 и 8) => не может быть результатом работы автомата.
1) program s_parallelogramm; var a,h,s: real; begin write('Основание = '); readln(a); write('Высота = '); read(h); if ((a=0) or (a<0)) or ((h=0) or (h<0)) then writeln('Ошибка! Значения основания и высоты должно быть натуральными числами') else begin s:=a*h; writeln('Площадь (S) параллелограмма = ', s); end; end.
2) program sp_kvadrata; var a,p,s: real; begin write('Сторона квадрата = '); readln(a); p:=4*a; s:=sqr(a); writeln('Периметр (P) квадарата = ', p); writeln('Площадь (S) квадарата = ', s); end.
3) program e_kinet; var m,v,e: real; begin write('Масса тела (m, кг) = '); readln(m); write('Скорость тела (v, км/ч) = '); readln(v); e:=m*sqr(v)/2; writeln('Кинетическая энергия (Ек, Дж) = ', e); end.
1) program vivod_chisel; var i, a: integer; begin a:=11; for i:=1 to 45 do begin write(a:3); a:=a+2; end; end.
2) program sym_trex_chisel_krat5; var mas: array[1..900] of integer; i,a,sym: integer; begin a:=100; sym:=0; for i:=1 to 900 do begin mas[i]:=a; if mas[i] mod 5 = 0 then sym:=sym+mas[i]; a:=a+1; end; writeln('Сумма трехзначных чисел, кратных 5 = ', sym); end.
2) Здесь уже надо подумать. Из нашего условия видно, что второе число повторяется дважды и там и там. То есть эти два числа (в данном случае 35 и 56) будут иметь одинаковый множитель "второе число". На это и будем опираться. Посмотрим. 35 можно получить из произведения 5 на 7, а число 56 - из произведения 8 на 7. Заметим, что цифра 7 повторяется там и там, то бишь это и есть наша вторая цифра => может оказаться результатом работы автомата.
3) Здесь 32 можно получить, перемножив цифры 8 и 4, а 16 - 2 на 8. Повторяется 8 => может оказаться результатом работы автомата.
4) Делители 35 - это 5 и 7, у 72 - это 9 и 2^3 (8). Здесь уже нет общих делителей. (9 умножить на 2 не получиться, так как это уже будет не цифрой. Только 9 и 8) => не может быть результатом работы автомата.
Более кратко будет так:
1)нет
2)да
3)да
4)нет
1)
program s_parallelogramm;
var
a,h,s: real;
begin
write('Основание = '); readln(a);
write('Высота = '); read(h);
if ((a=0) or (a<0)) or ((h=0) or (h<0)) then writeln('Ошибка! Значения основания и высоты должно быть натуральными числами')
else
begin
s:=a*h;
writeln('Площадь (S) параллелограмма = ', s);
end;
end.
2)
program sp_kvadrata;
var
a,p,s: real;
begin
write('Сторона квадрата = '); readln(a);
p:=4*a;
s:=sqr(a);
writeln('Периметр (P) квадарата = ', p);
writeln('Площадь (S) квадарата = ', s);
end.
3)
program e_kinet;
var
m,v,e: real;
begin
write('Масса тела (m, кг) = '); readln(m);
write('Скорость тела (v, км/ч) = '); readln(v);
e:=m*sqr(v)/2;
writeln('Кинетическая энергия (Ек, Дж) = ', e);
end.
1)
program vivod_chisel;
var
i, a: integer;
begin
a:=11;
for i:=1 to 45 do
begin
write(a:3);
a:=a+2;
end;
end.
2)
program sym_trex_chisel_krat5;
var
mas: array[1..900] of integer;
i,a,sym: integer;
begin
a:=100;
sym:=0;
for i:=1 to 900 do
begin
mas[i]:=a;
if mas[i] mod 5 = 0 then sym:=sym+mas[i];
a:=a+1;
end;
writeln('Сумма трехзначных чисел, кратных 5 = ', sym);
end.