Задача: В массиве Аn=[A0,A1,A2...An] найти : 1) количество множителей пар, троек, четверок, н-множителей 2) сумму произведений пар, троек, четверок... н-множителей Усложнение: 3) найти количество множителей пар, троек, четверок при м-количестве заданных элементов, где м<n 4) сумму произведений n-множителей с m-количеством заданных элементов. Пример: А5=[a,b,c,d,e] n=5. 1)5-терок = 1 = abcde 4 = 5= abcd, abce,abde,acde, bcde 3=10=abc,abd,abe,acd,ace,ade,bcd,bce,bde,cde 2=10=ab,ac,ad,ae,bc,bd,be,cd,ce,de 2)S5=abcde; S4=abcd+abce+abde+acde+bcde S3=abc+abd+abe+acd+ace+ade+bcd+bce+bde+cde S2=ab+ac+ad+ae+bc+bd+be+cd+ce+de Усложнение: заданные элементы b,d. Тогда: 1)5-терок = 1 = abcde 4 = 3= abcd,abde, bcde 3=3=abd,bcd,bde 2=1=bd 2)S5=abcde; S4=abcd+abde+bcde S3=abd+bcd+bde S2=bd Итак, приступаем к решению: Для начала найдем количество м-элементов в н-массиве с к-заданным количеством элементов. Используем рекурсию и факториал. Код (Text): function factorial($x){ if($x==0){ return 1; }else{ return $x*factorial($x-1); } } И создаем ф-цию нахождения м-элементов н-массива с к-заданным кол-вом элементов Код (Text): function calculate($n,$k){ for($i=$n;$i>$k;$i--){ $columns[$i]=factorial($n-$k)/(factorial($i-$k)*factorial($n-$i)); } return $columns; } Решение не очень красивое, но поэтому и нужна помощь. Тут чувствую тоже рекурсия должна быть, может кто подскажет. Итак, ф-ция возвращает массив, номер элемента которого соответствует количеству м-элементво, а значение элемента - количеству соединений м-элементов. Т.е. при n=5, к=0 columns=[5=>1, 4=>5, 3=>10, 2=>10, 1=>5]. А при n=5, к=2 columns=[5=>1, 4=>3, 3=>3, 2=>1]. Единицы опускаются, т.к. условие - минимум 2 элемента. Дальше- больше. Нужно найти сумму произведений. И вот тут вопрос: КАК???? Чувствую, рекурсия нужна. Т.к. без рекурсии вообще труба получается. Вот ф-ция нахождения для n=5 Тут $arg2- массив с 5-ю элементами, а $arg1-что именно мы ищем(пары, тройки и т.д) Код (Text): function getSum($arg1,$arg2){ switch($arg1){ case 5: break; case 4: break; case 3: break; case 2: for($i=0;$i<count($arg2);$i++){ for($j=$i+1;$j<count($arg2);$j++){ $sum2+=$arg2[$i]*$arg2[$j]; } } return $sum2; break; default: return 0; } } Из примера видно, что с каждым $arg1+1 будет увеличиваться вложение for(). Поэтому это не решение, а издевательство какое-то.!!! Может кто-то уже встречался с подобным? ПОмогите разобраться.
Нет. Для практического применения. Кстати, решение уже нашел. Если кому интересно, могу выложить. Если нет - тему фтопку!
Итак: Решение рекурсией Код (Text): //наш массив с a,b,c,d...n значениями $mas=[a,b,c,d]; //создаем вспомогательный массив for($i=0;$i<count($mas)+1;$i++){ $a[$i]=0; } function get_mult($last_idx,$product,$num_el,$mas,$a){ //values_games; $this->a[$num_el]+=$product; while(++$last_idx<count($mas)){ $s=$product*$mas[$last_idx]; $this->get_mult($last_idx,$s,$num_el+1,$mas,$this->a); } } //вызов ф-ции $this->get_mult(-1,1,0,$mas,$this->a); на выходе имеем массив а[], в котором индекс массива соответствует соединениям (пара-тройка-четверка), а значение - сумме произведений. Если есть фиксированные значения, отделяем фиксированные значения и не фиксированные. Фиксированные перемножаем между собой, а в ф-цию передаем массив с не фиксированными значениями. И на выходе массив а перемножаем с произведением фиксированных значений.