【问题标题】:Recursion algorithm seems correct but does not work递归算法似乎正确但不起作用
【发布时间】:2019-06-14 17:44:49
【问题描述】:

我正在尝试将 php 中的选择算法编写为递归的。 正如所见,这是正确的逻辑,但它不起作用。 这里是代码示例:

$array  = [4,5,22,0,-9];

function findmin($arr){
   
   if(sizeof($arr) > 0){
       $min_index = 0;
       for ($i = 1; $i < sizeof($arr); $i++){
           if($arr[$min_index] > $arr[$i]){
               $min_index = $i;
           }
       }
       
       unset($arr[$min_index]);
       findmin($arr);
   }   

}
findmin($array);

输出是:

注意:未定义的偏移量:第 20 行 test.pnp.php 中的 0

注意:未定义的偏移量:第 20 行 test.pnp.php 中的 0

注意:未定义的偏移量:第 20 行 test.pnp.php 中的 0

注意:未定义的偏移量:第 20 行 test.pnp.php 中的 0

注意:未定义的偏移量:第 20 行 test.pnp.php 中的 0...

附言第 20 行是代码的一部分:if($arr[$min_index] &gt; $arr[$i]){

【问题讨论】:

  • 当你取消设置数组中的元素时,键保持不变,重新索引你的数组
  • 您需要在取消设置值后检查数组,还需要更新 $min_index 因为循环后它总是尝试取消设置第 0 个索引
  • 不应该是找到最小回报的方法吗?
  • 这是做什么用的?

标签: php algorithm recursion


【解决方案1】:

有一种简单的方法可以递归地找到最小值:

function findMin($arr){
    $min = 0;
    foreach($arr as $item){
        if(is_array($item)){
            $val = findMin($item);
        }else{
            $val = $item;
        }
        $min  = $val<$min?$val:$min;
    }
    return $min;
}

你也可以使用min()函数

【讨论】:

  • 这段代码用于分层数组,他只是在使用平面数组。
  • 如果同时使用“for”和递归函数,您可以找到多维数组的最小值。对于一维(平面数组),您只需要一个“for”即可找到最小或递归函数
【解决方案2】:

当您取消设置数组中的元素时,键保持不变。让我们有键 0, 1, 2 - 未设置键 0,数组将有键 1, 2 - 所以,对于下一个循环,使用 array_values($arr) - 这将重新索引你的键。你也错过了退货声明。下面的固定代码

<?php

$array  = [4,5,22,0,-9];

function findmin($arr){

   if(sizeof($arr) > 1){
       $min_index = 0;
       for ($i = 1; $i < sizeof($arr); $i++){
           if($arr[$min_index] > $arr[$i]){
               $min_index = $i;
           }
       }
       unset($arr[$min_index]);
       // Here is added return and fixed indexes of array
       return findmin(array_values($arr));
   } elseif (sizeof($arr) === 1) {
       return $arr[0];
   }

}
echo findmin($array);

【讨论】:

  • 您也可以使用array_splice() 删除元素并重新索引。
  • 当然,但我想保留大部分原始代码
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多