Нахождение сумм произведений элементов массива

sphinks

Новичок
Задача:
В массиве А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
Итак, приступаем к решению:
Для начала найдем количество м-элементов в н-массиве с к-заданным количеством элементов. Используем рекурсию и факториал.

PHP:
function factorial($x){
     if($x==0){
      return 1;
     }else{
      return $x*factorial($x-1);
     }
    }

И создаем ф-цию нахождения м-элементов н-массива с к-заданным кол-вом элементов

PHP:
    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-что именно мы ищем(пары, тройки и т.д)
PHP:
    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(). Поэтому это не решение, а издевательство какое-то.!!!
Может кто-то уже встречался с подобным? ПОмогите разобраться.
 

rotoZOOM

ACM maniac
PHP:
$mas = array(10,20,30,40,50);   // начальный массив
$a = array_fill (0,count($mas)+1,0); // массив сумм произведений
function calc ($last_idx, $product, $num_el)
{
    global $mas,$a;
    $a[$num_el] += $product;
    while (++$last_idx < count($mas))
    {
        calc ($last_idx, $product * $mas[$last_idx],$num_el + 1);
    }
}
calc (-1,1,0);
После этого $a[$i] будет равен сумме произведений всех возможных $i'ок.
Как сделать вариант с фиксированными элементами подумай сам, задачка явно либо школьная олимпиадная,
либо на собеседовании.
 

sphinks

Новичок
rotoZOOM
Огромнейшее спасибо. Эта задачка имеет практическое применение.
Просто я высшего образования не имею, да и новичек еще в программировании.
Даже представить не мог, что может быть такое лаконичное "простое" решение.
Еще раз спасибо ). Дальше сам докручу. )
 
Сверху