Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: не могу разобраться с перебором, помогите!

Сообщения:  [1-10] 

 
 автор: Disable   (05.06.2007 в 17:17)   письмо автору
 
   для: adsd   (05.06.2007 в 17:06)
 

около 30 минут, получались сначала бесконечные циклы, что очень мешает процессу :)
самый часто используемый пример рекурсии:
-обход структуры каталога с другими каталогами (любой вложенности)

   
 
 автор: adsd   (05.06.2007 в 17:06)   письмо автору
 
   для: Disable   (05.06.2007 в 16:57)
 

спасибо огромное! сейчас буду разбираться.
а у меня с рекурсией какие-то невообразимые массивы строк выводило.
если не секрет, сколько времени на решение вы потратили? к чему стремиться?

   
 
 автор: adsd   (05.06.2007 в 17:00)   письмо автору
 
   для: Temnovit   (05.06.2007 в 15:22)
 

можно конечно так, если сегодня ничего путнего с рекурсией не придумаю, то так и сделаю.

   
 
 автор: Disable   (05.06.2007 в 16:57)   письмо автору
 
   для: adsd   (05.06.2007 в 14:16)
 


<?php
$mas
=array("a","b","c","d","e","f","x","1","2","3","4","5");
$str="hfls3h5nd8";
$str=">>3>>>5>8>"//строка изменена, так просто лучше видно когда заменяется :)

$i=0;
$counter=0//глобальный счетчик

/*
*мне показалось удобнее делать с "плэйсхолдерами"
*Это когда строка $str=">>4>>>4>3>";  заменяется на $str=">>{x1}>>>{x2}>{x3}>";
*а потом уже делается перебор
*/
$s=preg_replace_callback('|\d{1}|',repl,$str);

function 
repl($s)
{
    
//это функция обратного вызова, считает число цифр в строке и заменяет их на плэйсхолдеры
    
GLOBAL $i;
    
$i++;
    return 
"{x{$i}}";
}

function 
perebor($num,$s)
{
    
/*
    *эта функция заменяет плэйсхолдер номер $num на нужное значение, при этом увеличивая счетчик
    */
    
GLOBAL $mas,$counter;
    
$arr=array();
    foreach (
$mas as $v)
    {
        
$variant=str_replace("{x{$num}}",$v,$s); //замена плэйсхолдера номер $num

        
if ($num==1)
        {
            
/*
            *собственно, вот здесь и содержится один из многих вариантов
            *в данном случаи он просто выводится на обозрение
            */
            
echo $variant.'<br>';

            
$counter++; //увеличиваем "считалку"
        
}

        
$arr[]=$variant//для обработки других плэйсхолдеров надо записать их в массив
    
}
    return 
$arr;
}

function 
sorting($arr,$i)
{
    
/*
    *это рекурсивная функция, которая вызывает сама себя, пока все плэйсхолдеры не заменены
    */
    
$i--;
    foreach (
$arr as $v1)
    {
        
$prev=perebor($i,$v1);
        if (
$i>1)
        {
            
sorting($prev,$i); //рекуривный вызов
        
}

    }
}

sorting(perebor($i,$s),$i); //начнем перебор, далее рекурсивная функция будет вызывать сама себя
echo '<h1>'.$counter.'</h1>';

?>


выводит пресловутое 1728, должно работать с любым числом цифр.
думаю, что можно это сделать проще...

   
 
 автор: Temnovit   (05.06.2007 в 15:22)   письмо автору
 
   для: adsd   (05.06.2007 в 14:48)
 

Интересную вы задачу придумали :) Вызов прямо. Начнем с малого. Если просто тупо перебирать все возможные варианты, то можно так :

<?
  $array 
= array('a''b''c''d''e''f');

 
//все комбинации из 2-ех символов
  
for($i=0$i<count($array); $i++)
    for(
$j=0$j<count($array); $j++)
      echo 
$array[$i].'/'.$array[$j].'<br>';

 
//все комбинации из 3-ех символов
  
for($i=0$i<count($array); $i++)
    for(
$j=0$j<count($array); $j++)
     for(
$k=0$k<count($array); $k++)
      echo 
$array[$i].'/'.$array[$j].'/'.$array[$k].'<br>';

//и т.д.
?>

Способ топорный и неуклюжий. Думаем как перебирать с N символами...

   
 
 автор: adsd   (05.06.2007 в 14:48)   письмо автору
 
   для: Temnovit   (05.06.2007 в 14:28)
 

рандом не пойдёт.
нужны все возможные решения! или хотя бы половина :)
и вроде понимаю что рекурся будет самое то, но с рекурсией дела никогда не имел и наверное теперь она мне мстит (мозг закипает)

   
 
 автор: Temnovit   (05.06.2007 в 14:28)   письмо автору
 
   для: adsd   (05.06.2007 в 14:16)
 

Нужно все возможные варианты? Или один случайный? Если один случайный то

<?
$mas
=array("a","b","c","d","e","f","x","1","2","3","4","5");
$str="hfls3h5nd8";
while(
preg_match("\d"), $str)
$str preg_replace("/\d/"array_rand($mas), $str1);
?>

   
 
 автор: Trianon   (05.06.2007 в 14:23)   письмо автору
 
   для: adsd   (05.06.2007 в 14:16)
 

тот редкий случай, когда рекурсивное решение будет коротким и красивым, ... и вероятно, оправданным... а итеративное - длинным и ужасно запутанным.

   
 
 автор: bronenos   (05.06.2007 в 14:19)   письмо автору
 
   для: adsd   (05.06.2007 в 14:16)
 

рандомом чтоли заменить? или определенные элементы использовать?

   
 
 автор: adsd   (05.06.2007 в 14:16)   письмо автору
 
 

проблема такая
есть массив символов $mas=array("a","b","c","d","e","f","x","1","2","3","4","5")
есть строка из 10 символов (a..z,0..9) из которых цифр не более 4 $stroca="hfls3h5nd8"
цель скрипта найти в строке цифры и подставить вместо них символы из массива $mas, так если цифра в строке одна то разных вариантов 12, если цифры 3, то вариантов 12^3=1728.

как лутше произвести перебор? хотябы общее направление мыслей, не надо готового решения.

а то я думал задачка на 5 минут, а сам уже часа 4 сижу, ничего путнего в голову не приходит, туплю.

   

Сообщения:  [1-10] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования