![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как найти большее значение в двухмерном массиве? [D7, XP]
NightRain © (2007-01-24 19:08:00)Нужно найти наибольшее значение (число) в массиве и узнать его адрес или адреса если их несколько одинаковых.
Zeqfreed (2007-01-24 21:08:00) [1]> Джо © (24.01.07 20:55) [14]
Вот такой код как раз и является циклом в чистом виде. Может быть рекурсия и является циклом, но я бы в любом случае ее так не стал называть :)
Если рассмотреть рекурсивные вызовы на уровне ассемблерного кода, то да, там можно увидеть, что код выполняется циклически параллельно наращивая стек. Но процесс идет не линейно и не одномерно как в циклах, при выходе из процедуры, мы как бы возвращаемся на уровень выше. Ладно, будем считать, что я почти сдался :)
Джо (2007-01-24 20:55:00) [2]> [11] Zeqfreed © (24.01.07 19:44)
> > Джо © (24.01.07 19:40) [9]
>
> Я бы не назвал рекурсию циклом.
Надеюсь, меня не закидают помидорами :)
По-моему мнению, цикл — это последовательность действий, выполняемая циклически. То есть
Again:
DoSomething;
if not Condition then
Goto Again;
— самый настоящий цикл, хотя ни одного операторацикла в нем не использовано. Так и с рекурсией, ИМХО.
Zeqfreed (2007-01-24 19:53:00) [3]«Зигфрид», герой древнескандинавских и немецких мифов, правильно пишется вот так: Siegfried. Откуда у людей такое желание поставить g вместо q в моем нике? :)
NightRain (2007-01-24 19:45:00) [4]Zegfreed, я просто хотел сделать код как можно короче, а так уж лучше с циклами :)
Zeqfreed (2007-01-24 19:44:00) [5]> Джо © (24.01.07 19:40) [9]
Я бы не назвал рекурсию циклом. В принципе не спорю, что мой код — «грязный хак», но тем не менее это не цикл :) Использовать же такой подход, разумеется, не стоит и даже крайне противопоказано.
Джо (2007-01-24 19:41:00) [6]> [7] NightRain © (24.01.07 19:34)
> Только не смейтесь если я скажу глупость, просто я думал
> вдруг есть нечто подобное: x:=MAX(y[0..5])
Ну, есть в модуле Math функция MaxValue (для одномерного массива Double). Смотришь реализацию, а там (сюрприз!) — цикл.
Джо (2007-01-24 19:40:00) [7]> [8] Zeqfreed © (24.01.07 19:34)
> Фух. Вроде без циклов и
Рекурсия — это тот же цикл, только хитро спрятанный. К тому же для данной задачи применение рекурсии вряд ли оправданно :)
NightRain (2007-01-24 19:34:00) [8]Только не смейтесь если я скажу глупость, просто я думал вдруг есть нечто подобное: x:=MAX(y[0..5])
Zeqfreed (2007-01-24 19:34:00) [9]
uses
Math;
type
T2dArray = array of array of Integer;
function GetMaxValue(const a : T2dArray) : Integer;
var
max : Integer;
procedure GoDeeper(i, j : Integer; dir : Integer);
begin
if (i > High(a)) or (j > (High(a[Low(a)])) then Exit;
max := Max(max, a[i, j]);
case dir of
0: begin
GoDeeper(i + 1, j + 1, 0);
GoDeeper(i + 1, j, 1);
GoDeeper(i, j + 1, 2);
end;
1: GoDeeper(i + 1, j, 1);
2: GoDeeper(i, j + 1, 2);
end;
end;
var
mi, mj : Integer;
begin
mi = Low(a);
mj = Low(a[Low(a)]);
max := a[mi, mj];
GoDeeper(mi, mj, 0);
Result := max;
end;
Фух. Вроде без циклов и теоретически должно работать, но я не проверял и не могу гарантировать :)
Джо (2007-01-24 19:26:00) [10]> [3] NightRain © (24.01.07 19:17)
> А без циклов ни как? Может есть какая нибудь функция которая
> возвращает максимальное значение в массиве?
Волшебства не бывает, это Вас кто-то обманул... Есть там функция или нет ее — с циклом будет.
Palladin (2007-01-24 19:22:00) [11]рекомендую порешать академические задачи, дурацкие вопросы отпадут
Palladin (2007-01-24 19:21:00) [12]
> [3] NightRain ©
ага есть, но в ней цикл
NightRain (2007-01-24 19:17:00) [13]А без циклов ни как? Может есть какая нибудь функция которая возвращает максимальное значение в массиве?
NightRain (2007-01-24 19:16:00) [14]А без циклов ни как? Может есть какая нибудь функция которая возвращает максимальное значение в массиве?
Джо (2007-01-24 19:09:00) [15]Два цикла (вложенных), оператор сравнения, оператор присваивания.