|
|
|
| Точнее надо последовательность из n элементов разнести по m массивам.
Массивы называются, например $ar1, $ar2, ... arm.
Их последовательность задана, менять местами нельзя
Элементы тоже упорядочены и последовательность их расположения тоже менять нельзя.
Например, если элементы 1,2,3,4, а массивы $ar1, $ar2, $ar3, то можно так:
<?
$ar1=array(1);
$ar2=array(2);
$ar3=array(3,4);
// Или так:
$ar1=array(1);
$ar2=array(2,3);
$ar3=array(4);
// Или так:
$ar1=array(1,2);
$ar2=array(2);
$ar3=array(4);
|
Больше никак нельзя
Надо написать функцию для произвольных n и m (m <= n)(разумеется)
Кажется, что простая задачка, но никак не могу сообразить!
Вот так - уже неправильно:
<?
$ar1=array(1);
$ar2=array(3,2);
$ar3=array(4);
|
| |
|
|
|
|
|
|
|
для: Eugene77
(16.10.2008 в 16:25)
| | Ну если судить по первым двум, то третий напрашивается как:
$ar1=array(1,2);
$ar2=array(3);
$ar3=array(4);
Или? | |
|
|
|
|
|
|
|
для: sim5
(16.10.2008 в 16:30)
| | >Ну если судить по первым двум, то третий напрашивается как:
>$ar1=array(1,2);
>$ar2=array(3);
>$ar3=array(4);
>
>Или?
Да!
Спасибо за поправку! | |
|
|
|
|
|
|
|
для: Eugene77
(16.10.2008 в 16:25)
| | Нужно получить все возможные варианты распределения, или первый подходящий? | |
|
|
|
|
|
|
|
для: Trianon
(16.10.2008 в 16:36)
| | Обязательно все варианты | |
|
|
|
|
|
|
|
для: Eugene77
(16.10.2008 в 19:36)
| | рекурсией глубиной m решается в лоб. Вроде бы. | |
|
|
|
|
|
|
|
для: Trianon
(16.10.2008 в 20:00)
| | Вроде бы рекурсией надо решать, но что-то не могу алгоритм чётко представить.
Может быть вы решите её для меня? | |
|
|
|
|
|
|
|
для: Eugene77
(16.10.2008 в 20:44)
| |
<?php
function out($v)
{
for($a = 1, $i = 0; $i < count($v); $i++)
{
for($j = 0;$j < $v[$i]; $j++)
echo ' '.($a++);
echo ', ';
}
echo"<br />\r\n";
}
function gen(&$v, $m, $n)
{
if($m == 1)
{
$v[0] = $n;
out($v);
}
else
for($k = $n-($m-1); $k >=1; --$k)
{
$v[$m-1] = $k;
gen(&$v, $m-1, $n-$k);
}
}
$m = 4;
$n = 8;
$v = array();
gen(&$v, $m, $n);
?>
|
donations как грицца pending | |
|
|
|
|
|
|
|
для: Trianon
(16.10.2008 в 22:04)
| | Красиво!
И в принципе понятно.
Хотя не совсем ясно зачем нужно применять &
Разъясните?
И я немного другое имел в виду...
Я подразумевал, что у меня есть уже изначально n элементов, например, в массиве лежат.
<?
$nnn = array{'"яблоко", "груша", "помидор", "слива"};
| Они и сортируются по корзинам.
Конечно, теперь-то я смогу и переделать под изначально заданный массив, но если это сделает рука автора, то, кажется, это лучше получится, чем у меня.
Хоть увижу профессиональный код...
А положить в корзину - это вызов функции:
<?
function put_basket(array $elements){
// print_r($elements);
echo implode(" ", $elements).", ";
}
|
| |
|
|
|
|
|
|
|
для: Eugene77
(17.10.2008 в 20:51)
| | >Хотя не совсем ясно зачем нужно применять &
>Разъясните?
Иначе на каждом уровне придется создавать новый массив.
Минимизировать объем локальных переменных рекурсивной функции естественно - для меня.
>Конечно, теперь-то я смогу и переделать под изначально заданный массив,
>но если это сделает рука автора, то, кажется, это лучше получится, чем у меня.
Я переживу, если Вы это сами сделаете.
Точнее, наоборот, я даже не стану переживать.
Рассовать проиндексированные элементы массива Вы всяко в состоянии. | |
|
|
|
|
|
|
|
для: Trianon
(17.10.2008 в 21:18)
| | >>Хотя не совсем ясно зачем нужно применять &
>>Разъясните?
>
>Иначе на каждом уровне придется создавать новый массив.
>Минимизировать объем локальных переменных рекурсивной функции естественно - для меня.
Интересные уроки вы даёте!
Я бы, наверно, если бы меня посетила идея минимизации объёма переменных рекурсивной функции, использовал бы глобальный массив, объявляя это в функции:
<?
function recurcive(){
global $v;
............
}
$v = array();
|
Такой подход чем-то хуже? | |
|
|
|
|
|
|
|
для: Eugene77
(18.10.2008 в 07:04)
| | Применение глобальных и статических переменных для хранения локальных (по своей алгоритмической природе) данных, приводит к тому, что код перестает быть реентерабельным.
Поясню данный случай. Применить эту функцию для распределения N1 вагонов по M1 составам поездов, и N2 товаров по M2 вагонам при глобальном $v Вы бы уже не смогли.
Не то что это требовалось. Но опять же, для меня - естественно не порождать нереентерабельный код везде где этого можно избежать малой кровью. | |
|
|
|
|
|
|
|
для: Trianon
(18.10.2008 в 11:17)
| | Хорошо, что вы это сказали!
Настоящие уроки мастера! | |
|
|
|
|
|
|
|
для: Trianon
(18.10.2008 в 11:17)
| | Кстати, вы коснулись темы, над которой я ломал голову, даже не зная как она называется.
Дело в том, что эта функция вызывается, в свою очередь, рекурсивно.
И с глобальными данными не очень удобно.
Собственно,мне нужно подправить совсем чуть-чуть:
<?php
function out($v) {
global $baskets, $goods;
for($a = 1, $i = 0; $i < count($v); $i++) {
echo "In ".$baskets[$i].' ';
for($j = 0;$j < $v[$i]; $j++)
echo ' '.$goods[($a++)];
echo ', ';
}
echo"<br />\r\n";
}
function gen(&$v, $m, $n) {
if($m == 1) {
$v[0] = $n;
out($v);
}
else
for($k = $n-($m-1); $k >=1; --$k) {
$v[$m-1] = $k;
gen(&$v, $m-1, $n-$k);
}
}
$m = sizeof($baskets=array("basket1", "basket2", "basket3", "basket4" ));
$n = sizeof($goods=array("g1", "g2", "g3", "g4", "g5", "g6", "g7", "g8" ));
$v = array();
gen(&$v, $m, $n);
?>
|
Функция перераспределяет элементы между массивами по вашему алгоритму.
Только я не могу сообразить, как продолжить в вашем же духе работу с этими массивами.
(Никогда не пользовался &)
Или так нормально?
Мне важно узнать, как бы вы написали: Хочу научиться хорошему стилю.
Возможно здесь что-то оптимизировать по скорости и по объёму оперативной памяти, захватываемой при вызове с большими n и m? | |
|
|
|