PHP约瑟夫问题,丢手帕问题

来源:互联网 发布:照度计软件 编辑:程序博客网 时间:2024/05/04 19:40

无意间看到了这个丢手帕问题,于是乎自己动手写了写这个的解决方法。

//test//$arr 数组//$limit要数的个数//$j从第几个开始数//$n数组总数//$rank循环取了的次数function get_last($arr,$limit,$j,$n,$rank=0){    //得到最后值    if(count($arr)<2){        sort($arr);        echo "最终的值是".$arr[0];    }        $k = $rank;    //echo "开始".$j;    for($i=($j-1);$i<$n;$i++){        if(isset($arr[$i])){            $k++;        }else{            continue;        }        //取出的数值        if($k == $limit){            echo '取出的是'.$arr[$i]."<br/><br/>";            unset($arr[$i]);            $start = $i+2;            if($start >= $n){                $start = 1;            }            get_last($arr,$limit,$start,$n,0);            break;        }        //判断后续是否还有元素        $count = 0;        for($a = $i+1;$a<$n;$a++){                       if(isset($arr[$a])){               $count++;           }         }        //判断没有后续元素时,没有了则从头开始统计        if( $count<1 ){            get_last($arr,$limit,1,$n,$k);        }    }}

其实挺简单的一个问题,主要需要注意一些细节,当循环到后面没有数值或者不足要数的个数时。

$arr = array(1,2,3,4,5,6,7,8,9,10);get_last($arr,4,1,10,0);

最终输出数值5。另外网上找了一个对比了一下,感觉自己写的多了个循环,思路简单,找的是总结了数据的规律进行计算了一下

function doJosephus($arr, $k, $m) {    //静态变量(存在数据不能计时清除的危险)      static $storage = array();    $temp = array();    $cnt = count($arr);    //判断数组是否有元素,否则退出执行      if ($cnt) {        $k_mod = ($cnt - $k + 1) % $m - $m; //为下一次调用时设置的开始位置          static $start = 1; //初始化开始位置为1          for ($i = 0; $i < $cnt; $i++) {            if ($i >= $k - 1) {//从大于等于$k位置(计为1),开始处理                  if (!($start % $m)) {                    //等于$m长度则入库                      $storage[] = array_shift($arr);                } else {                    //不属于$m长度的则计入下一个处理的数组                      $temp[] = array_shift($arr);                }                //指针在一个环内不断的往前走(加1)                  $start++;            } else {                //在$k位置之前的元素全部进入下一次循环                  $temp[] = array_shift($arr);            }        }        //递归调用开始(模拟链接环的作用)          doJosephus($temp, $k_mod, $m);    }    return $storage;}

0 0