Recursion algorithm seems correct but does not work

I am trying to write selection algorithm in php as recursive. As seen it is correct logic but it does not work. here ar code example:

$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);

and output is:

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20

Notice: Undefined offset: 0 in test.pnp.php on line 20...

p.s. line 20 is part of code: if($arr[$min_index] > $arr[$i]){

Upvotes: 0

Views: 71

Answers (2)

Eakethet
Eakethet

Reputation: 682

When you unset element in an array, the keys remain the same. Lets have keys 0, 1, 2 - unset key 0, the array will have keys 1, 2 - so, for next loop use array_values($arr) - that will reindex you keys. Also you've missed return statement. Fixed code below

<?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);

Upvotes: 0

Ali Ghalambaz
Ali Ghalambaz

Reputation: 420

there is a simple way to find minimum recursivly :

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;
}

also you can use min() function

Upvotes: 1

Related Questions