Рекурсии - они разные бывают. Соответственно - и эту задачу тоже можно по разному через рекурсию сделать.. . Можно через хвостовую рекурсию. А можно через обычную. Тебе - какой лучше?
Вот смотри:
(define ave (lambda (l)
(let loop((res 0)(l l)(n 0))
(if (null? l) res
(loop (/ (+ (car l)(* res n))(+ n 1))(cdr l)(+ n 1))))))
(display (ave '(1 2 3 4)))(newline)
Здесь определяется внутренняя рекурсивная функция loop с тремя параметрами:
res - промежуточный результат,
l - промежуточный список элементов
n - количество обработанных элементов списка.
Если список пустой, то вернуть res как результат
Иначе воспользоваться формулой: A(n+1) = (m[n+1] + A(n)*n)/(n+1)
и вызвать loop с новым промежуточным результатом: (/ (+ (car l)(* res n))(+ n 1))
уменьшенным на один элемент массивом: (cdr l) и увеличенным на 1 n: (+ n 1)
Это вариант с хвостовой рекурсией.
Другие языки программирования и технологии
Напишите программу для расчета среднего арифметического всех элементов числового массива рекурсией
Давайте лучше напишем программу ГОЭЛРО?
Delphi (при некоторой модификации и Pascal):
{$apptype console}
const
SIZE = 10;
type
TArray = array [1 .. SIZE] of integer;
procedure Fill(var aValue: TArray);
var
i: integer;
begin
Randomize();
for i := Low(aValue) to High(aValue) do
aValue[ i] := Random(50);
end;
function Get(aValue: TArray): real;
procedure GetAvg(aValue: TArray; idx, count, sum: integer; var res: double);
begin
if (idx = High(aValue)) then
begin
Inc(sum, aValue[idx]);
Inc(count);
res := sum/count;
end
else begin
GetAvg(aValue, idx + 1, count + 1, sum + aValue[idx], res);
end;
end;
var
res: double;
begin
GetAvg(aValue, Low(aValue), 0, 0, res);
Get := res;
end;
procedure Print(aValue: TArray);
var
i: integer;
begin
for i := Low(aValue) to High(aValue) do
write(aValue[ i]:3, ' ');
writeln;
end;
var
a: TArray;
begin
Fill(a);
Print(a);
writeln('Result = ', Get(a):5:3);
readln;
end.
{$apptype console}
const
SIZE = 10;
type
TArray = array [1 .. SIZE] of integer;
procedure Fill(var aValue: TArray);
var
i: integer;
begin
Randomize();
for i := Low(aValue) to High(aValue) do
aValue[ i] := Random(50);
end;
function Get(aValue: TArray): real;
procedure GetAvg(aValue: TArray; idx, count, sum: integer; var res: double);
begin
if (idx = High(aValue)) then
begin
Inc(sum, aValue[idx]);
Inc(count);
res := sum/count;
end
else begin
GetAvg(aValue, idx + 1, count + 1, sum + aValue[idx], res);
end;
end;
var
res: double;
begin
GetAvg(aValue, Low(aValue), 0, 0, res);
Get := res;
end;
procedure Print(aValue: TArray);
var
i: integer;
begin
for i := Low(aValue) to High(aValue) do
write(aValue[ i]:3, ' ');
writeln;
end;
var
a: TArray;
begin
Fill(a);
Print(a);
writeln('Result = ', Get(a):5:3);
readln;
end.
с точки зрения банальной эрудиции, если посмотреть сверху, то с низу мы видим, что по краям нихрена нет!!!
Похожие вопросы
- помогите написать программку которая определяет среднее арифметическое непарных элементов массива.
- напишите программу которая находит минимальный и максимальный элементы матрицы и их индексы
- Напишите функцию, которая возвращает среднее арифметическое целых чисел i, j,k,m
- Дан массив L1,..,L20. Заменить элементы, стоящие после Lmin, на среднее арифметическое всего ряда.
- Напишите программу, которая находит в массиве количество элементов, равных заданному значению X .
- Написать программу в VBA арифметической прогрессии в динамическом массиве.
- Написать программу работы с одномерным массивом из 15 вещественных элементов для решения задач:
- Поиск наибольшего отрицательного элемента массива (c++) и его удаление, написал программу, где то косячек =/
- 1. Написать программу, которая заполняет массив целых чисел размеров 20 элементов значениями роста учащихся (случайные ч
- С++.Дан одномерный числовой массив. Написать функции.