Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Переменное количество вложенных циклов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
jelome
Отправлено: 09 Апреля, 2014 - 13:33:22
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Всем привет! Мне нужно организовать интересную структуру циклов. Задача состоит в том, чтобы выполнялось заранее заданное количество вложений цикла в цикл.

Вот статический пример:

$n = 5;

for($i=0; $i<$n; $i++) {
for($j=$i+1; $j<$n; $j++) {
for($k=$j+1; $k<$n; $k++) {
for($l=$k+1; $l<$n; $l++) {
echo $i.$j.$k.$l.'<br>';
}
}
}
}

Будет выводить:

0123
0124
0134
0234
1234

Это перебор матрицы с заданным количество столбцов в подматрице.
Так вот нужно сделать так, чтобы я задал, например $m=4 и функция выполнила эти вложения 4 раза, как это видно в статическом примере.

Буду очень благодарен за помощь.
 
 Top
Contr
Отправлено: 09 Апреля, 2014 - 19:39:31
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Ну а сами-то что надумали по этой задаче? Во сколько оцениваете решение этой задачи?

(Отредактировано автором: 09 Апреля, 2014 - 19:50:28)

 
 Top
jelome
Отправлено: 10 Апреля, 2014 - 09:42:19
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Contr пишет:
Ну а сами-то что надумали по этой задаче? Во сколько оцениваете решение этой задачи?


Думал через функцию вызывать цикл нужное количество раз, рекурсию делать. Но потом понял, что возвращаться к предыдущим циклам не получиться. А так больше не знаю, что еще придумать.

Ну вот, что в моих силах:

$n = 5;
function loop($i, $m) {
for($i=$i+1; $i<$n; $i++) {
if($m>0) {
$m--;
loop($i,$m);
}
}
}
loop(-1,4);
 
 Top
Contr
Отправлено: 10 Апреля, 2014 - 09:49:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




jelome пишет:
что еще придумать

Это решаемая задача
Contr пишет:
Во сколько оцениваете решение этой задачи?

Если просто разминка для мозгов с олимпиады - пуская этим занимаются профессора. Если есть стоимость и практическая ценность- тогда будет и решение. Научные труды не пишем. Стоимость озвучьте, а то разойдемся на решение более "практичных" задач

(Отредактировано автором: 10 Апреля, 2014 - 09:52:08)

 
 Top
jelome
Отправлено: 10 Апреля, 2014 - 09:59:10
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Contr пишет:
jelome пишет:
что еще придумать

Это решаемая задача
Contr пишет:
Во сколько оцениваете решение этой задачи?

Если просто разминка для мозгов с олимпиады - пуская этим занимаются профессора. Если есть стоимость и практическая ценность- тогда будет и решение. Научные труды не пишем. Стоимость озвучьте, а то разойдемся на решение более "практичных" задач


Это не коммерческая задача. Нужно по учебе. Спасибо, что хоть отозвались.
 
 Top
Contr
Отправлено: 10 Апреля, 2014 - 15:24:38
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Работает, но только не с большими числами: (оптимизировать/писать решение лучше времени у меня мало):
PHP:
скопировать код в буфер обмена
  1.  
  2. $m = 3;
  3. $n = 6;
  4.  
  5. $a = array();
  6. for ($i = 0; $i < $m + 1; $i++) {
  7.     $a[$i] = 0;
  8. }
  9. $a[-1] = -1;
  10.  
  11.  
  12. for ($k = 0; $k < pow($n, $m - 1); $k++) {
  13.     for ($j = 0; $j < $n; $j++) {
  14.         //Сброс счетчика:
  15.         if ($a[$m - 1] == $n) {//Дошли до конца
  16.             echo 'Выход';
  17.             exit();
  18.         }
  19.         for ($i = 0; $i < $m; $i++) {
  20.             if (($a[$i] >= $n - 1 && $i === 0) || ($a[$i] >= $n && $i !== 0)) {
  21.                 $a[$i + 1] = $a[$i + 1] + 1;
  22.                 $a[$i] = 0;
  23.             }
  24.         }
  25.         //Конец сброса счетчика
  26.  
  27.         $a[0] = $j;
  28.  
  29.         //Печаталка:
  30.         $print = '';
  31.         for ($i = 0; $i < $m; $i++) {
  32.             $print = $a[$i - 1] < $a[$i] && $print !== -1 ? $print . $a[$i] : -1;
  33.         }
  34.         if ($print !== -1) {
  35.             echo $print . '<br/>';
  36.         }
  37.         //Конец печаталке
  38.     }
  39. }

Ну как? Хорошо

(Отредактировано автором: 10 Апреля, 2014 - 15:25:54)

 
 Top
LIME
Отправлено: 10 Апреля, 2014 - 18:18:39
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Либо я не вник в задачу либо это задачка на рекурсии
Погугли рекурсии
 
 Top
Contr
Отправлено: 11 Апреля, 2014 - 15:25:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 202
Дата рег-ции: Окт. 2011  
Откуда: с Марса


Помог: 1 раз(а)




Лови и оптимизированное решение:
Спойлер (Отобразить)

Отпишись, студент))) Хорошо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB