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]   

> Описание: Помогите, плз
sphinks
Отправлено: 19 Января, 2012 - 14:56:02
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


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




Задача:
В массиве А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:
скопировать код в буфер обмена
  1.  
  2. function factorial($x){
  3.  if($x==0){
  4.   return 1;
  5.  }else{
  6.   return $x*factorial($x-1);
  7.  }
  8. }
  9.  

И создаем ф-цию нахождения м-элементов н-массива с к-заданным кол-вом элементов
PHP:
скопировать код в буфер обмена
  1.  
  2. function calculate($n,$k){
  3.  for($i=$n;$i>$k;$i--){
  4.                 $columns[$i]=factorial($n-$k)/(factorial($i-$k)*factorial($n-$i));
  5.         }
  6.         return $columns;
  7. }
  8.  

Решение не очень красивое, но поэтому и нужна помощь. Тут чувствую тоже рекурсия должна быть, может кто подскажет.
Итак, ф-ция возвращает массив, номер элемента которого соответствует количеству м-элементво, а значение элемента - количеству соединений м-элементов.
Т.е. при 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:
скопировать код в буфер обмена
  1.  
  2. function getSum($arg1,$arg2){
  3.  switch($arg1){
  4.   case 5: break;
  5.   case 4: break;
  6.   case 3: break;
  7.   case 2: for($i=0;$i<count($arg2);$i++){
  8.                 for($j=$i+1;$j<count($arg2);$j++){
  9.                    $sum2+=$arg2[$i]*$arg2[$j];
  10.                }
  11.              }
  12.    return $sum2;
  13.    break;
  14.   default: return 0;
  15.  }
  16. }
  17.  

Из примера видно, что с каждым $arg1+1 будет увеличиваться вложение for(). Поэтому это не решение, а издевательство какое-то.!!!
Может кто-то уже встречался с подобным? ПОмогите разобраться.

(Отредактировано автором: 19 Января, 2012 - 15:57:31)

 
 Top
sphinks
Отправлено: 19 Января, 2012 - 20:18:08
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


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




Спасибо всем за помощь.
Решение найдено. Если интересно, могу выложить.
А нет - тему ф топку!
 
 Top
Самогонщик
Отправлено: 19 Января, 2012 - 20:22:12
Post Id



Посетитель


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


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




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

Рекурсией решил?
 
 Top
sphinks
Отправлено: 28 Января, 2012 - 18:15:42
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2011  


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




Итак:
Решение рекурсией

PHP:
скопировать код в буфер обмена
  1.  
  2. //наш массив с a,b,c,d...n значениями
  3. $mas=[a,b,c,d];
  4.  
  5. //создаем вспомогательный массив
  6. for($i=0;$i<count($mas)+1;$i++){
  7.     $a[$i]=0;
  8. }
  9.  
  10. function get_mult($last_idx,$product,$num_el,$mas,$a){
  11.                 //values_games;
  12.                 $this->a[$num_el]+=$product;
  13.                 while(++$last_idx<count($mas)){
  14.                         $s=$product*$mas[$last_idx];
  15.                         $this->get_mult($last_idx,$s,$num_el+1,$mas,$this->a);
  16.                 }
  17.         }
  18. //вызов ф-ции
  19. $this->get_mult(-1,1,0,$mas,$this->a);
  20.  

на выходе имеем массив а[], в котором индекс массива соответствует соединениям (пара-тройка-четверка), а значение - сумме произведений.
Если есть фиксированные значения, отделяем фиксированные значения и не фиксированные. Фиксированные перемножаем между собой, а в ф-цию передаем массив с не фиксированными значениями. И на выходе массив а перемножаем с произведением фиксированных значений.
 
 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