一個強悍的算24點游戲的PHP程序(遞歸函數的妙用)

jopen 12年前發布 | 21K 次閱讀 PHP PHP開發

研究遞歸函數 找到的一個經典的例子

<?php

set_time_limit(0); $values = array(5, 5, 5, 1); $result = 24;

$list = array();

echo "<pre>"; makeValue($values); print_r($list);

function makeValue($values, $set=array()) { $words = array("+", "-", "*", "/"); if(sizeof($values)==1) { $set[] = array_shift($values); return makeSpecial($set); }

foreach($values as $key=>$value) 
{ 
    $tmpValues = $values; 
    unset($tmpValues[$key]); 
    foreach($words as $word) 
    { 
        makeValue($tmpValues, array_merge($set, array($value, $word))); 
    } 
} 

}

function makeSpecial($set) { $size = sizeof($set);

if($size<=3 || !in_array("/", $set) && !in_array("*", $set)) 
{ 
    return makeResult($set); 
}

for($len=3; $len<$size-1; $len+=2) 
{ 
    for($start=0; $start<$size-1; $start+=2) 
    { 
        if(!($set[$start-1]=="*" || $set[$start-1]=="/" || $set[$start+$len]=="*" || $set[$start+$len]=="/")) 
            continue; 
        $subSet = array_slice($set, $start, $len); 
        if(!in_array("+", $subSet) && !in_array("-", $subSet)) 
            continue; 
        $tmpSet = $set; 
        array_splice($tmpSet, $start, $len-1); 
        $tmpSet[$start] = "(".implode("", $subSet).")"; 
        makeSpecial($tmpSet); 
    } 
} 

}

function makeResult($set) { global $result, $list; $str = implode("", $set); @eval("\$num=$str;"); if($num==$result && !in_array($str, $list)) $list[] = $str; }

?></pre>原文地址:http://www.nowamagic.net/php/php_24PointsGame.php

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!