За числата 2,4,6,8 и операциите +, -, *, / намерете комбинацията от числата, операциите и произволен борй скоби, която да е валиден математически израз с решение 25.
<?php
$num = array(2,4,6,8);
function($x,$y){return $x+$y;},
'-' => function($x,$y){return $x-$y;},
'*' => function($x,$y){return $x*$y;},
'/' => function($x,$y){return $x/$y;},
);
function calc($x, $y, $op){
return $op($x,$y);
}
function recurse($level, $sum, $exp){
global $num;
global $op;
if ($level == 4){
if ($sum == 25){
echo $exp."\n";
die();
}
return;
}
$level++;
foreach($num as $n){
foreach($op as $s => $o){
if (!($sum == 0 && $s == '/')){
recurse ($level, calc($n, $sum, $o), '('.$n.$s.$exp.')');
}
}
}
}
recurse(0,0,'');
?>
Използваме рекурсия за да обходим всички числа и операции. Методът не е е най-ефективен защото ползва евристично търсене но за толкова малко комбинации това не е проблем. Скрипта изисква PHP 5.3+ заради анонимните функции. За по-стари версии могат да се промени дефиницията им или да се ползва case за определяне на операцията.
~> php 02_chisla_operacii.php (4*(6+(2/(8+))))
Няма коментари:
Публикуване на коментар