当前位置: 首页 > 知识库问答 >
问题:

以递归方式转换我的脚本?

朱乐逸
2023-03-14

我有脚本谁搜索最近的搜索号码。例如,假设数组中有以下数字:

'0' =

'0.25' =

'0.75'=

'1' =

我正在寻找0.50的差点,所以0.25和0.75在0.50的相同范围内。

在这种情况下,我想得到更大的数值,在这个例子中是0.75。

有效的代码是:

function getClosest($search, $arr) {
   $closest = null;
   $num_arr = array();
   $odd = 0.00;
   $i = 0;
   foreach ($arr as $handicap=>$item) { //first closest number
      if ($closest === null || abs($search - $closest) > abs($handicap - $search)) {
         $closest = $handicap;
         $odd = $item;
      }
      else{
          $num_arr[$handicap] = $item;
      }
   }
   $newclosest = null;
   $newodd = 0.00;
   foreach($num_arr as $handicap=>$newitem){ //second closest number
      if ($newclosest === null || abs($search - $closest) > abs($handicap - $search)) {
         $newclosest = $handicap;
         $newodd = $newitem;
      }
   }
   //if difference between first and second number are same
   if(abs($search - $closest) == abs($newclosest - $search)){ 
       if($newclosest > $closest){ //if second number is greater than first
           $closest = $newclosest;
           $odd = $newodd;
       }
   }
   return array('handicap'=>$closest,'odd'=>$odd);
}

我知道我可以在这里使用递归,但我没有使用递归的经验。我知道我需要这样称呼它:

$rec_arr = getClosest($num_arr,$search);

但即使我转储函数输出,也会得到空白页。

共有2个答案

巫马磊
2023-03-14
//$a is array to be searched
//$s is search key
//$prev_key and $next_key will be output required

$a = array('0'=>1,'0.25'=>123,'0.75'=>456,'0.78'=>456,'1'=>788);
$s = '0';

if(isset($a[$s])){
    echo $s;
}
else{

    reset($a);//good to do

    while(key($a) < $s){ 
        next($a);
    }

    $next_key = key($a);
    prev($a);
    $prev_key = key($a);

    echo $prev_key.'-'.$next_key;
}

上面的代码使用数组内部指针。我想这可能会对你有所帮助...

资料来源:https://stackoverflow.com/a/4792770/3202287

苏鸿志
2023-03-14

使用array_map函数,

$data = array('0'=>1.72,'0.75'=> 2.35,'0.25'=>1.92,'1' => 3.00);
$v = 0.5; // search value 

$x = null; // difference value
$y = array(); // temporary array
array_map(function($i)use($data,$v,&$x,&$y){
    if(isset($x)){
        if($x > abs($i-$v)){ // if difference value is bigger than current
            $x = abs($i-$v);
            $y = array($i=>$data[$i]);
        }else if($x == abs($i-$v)){ // if difference value is same
            $key = array_keys($y);
            $y = $key[0] < $i ? array($i=>$data[$i]) : $y;
        }
    }else{ // first loop
        $x = abs($i-$v);
        $y = array($i=>$data[$i]);
    }
},array_keys($data));
print_r($y); // result

输出<代码>数组([0.75]=

 类似资料:
  • 请检查下面的反转功能。剩下的代码应该没问题。由于某种原因,该函数没有反转双链接列表。 双链表节点结构 双链表结构 按从头部到尾部的顺序排列。 请检查下面的反向函数,因为此函数不会返回反向双链接列表。检查是否有任何错误并让我知道。

  • 我有一个关于如何将“递归”转换为“尾部递归”的问题。 这不是家庭作业,只是在我试图润色算法书籍中的递归定理时出现的一个问题。 我熟悉使用递归的两个典型示例(阶乘和斐波那契序列),也知道如何以递归方式和尾部递归方式实现它们。 我的代码如下(我使用Perl只是为了使其简单,但可以轻松地转换为C/Java/C)。 运行代码时,输出如下: 递归函数在返回之前使用不同的参数调用自己两次。我尝试了几种方法将其

  • 我们正在获取具有以下字段的订单数据(仅显示相关字段) 具有NULLoriginal_orderid的订单可以被认为是父订单 其中一些父母订单可能有子订单,子订单的original_orderid映射到父母的订单。 子顺序可以产生另一个子顺序,如图像所示,带有颜色编码。 与原始文本相同的数据: 作为转换,我们需要将所有子节点映射到它们的原始父节点(original_orderid为NULL),并获得

  • 我想知道是否有一些通用方法可以用foo(…)转换“正常”递归foo(…) 作为尾部递归的最后一个调用。 例如(scala): 函数语言将递归函数转换为等价尾部调用的一般解决方案: 一种简单的方法是将非尾部递归函数包装在蹦床单子中。 所以pascal函数不再是递归函数。然而,蹦床单子是需要完成的计算的嵌套结构。最后,是一个尾递归函数,它遍历树状结构,解释它,最后在基本情况下返回值。 Rúnar Bj

  • 我有一个递归算法,我用它来迭代分层数据结构,但不幸的是,对于一些数据,分层结构太深,以至于我得到了一个StackOverflow错误。我见过这种情况发生在大约150个节点的深度上,而数据可能会增长到更远的程度。对于上下文,这段代码将在有限的环境中运行,改变JVM堆栈大小不是一个选项,数据结构是给定的,代表不同的文件系统和目录和文件。 为了解决堆栈溢出问题,我尝试将算法转换为迭代算法。这不是我以前必

  • 我只是想知道这样的函数是否可以递归地完成。我觉得很难,因为它自己叫了两次。 这是我在javascript中的非尾部递归实现。(是的,我知道大多数javascript引擎不支持TCO,但这只是理论上的。)目标是找到给定数组(arr)中具有特定长度(大小)的所有子列表。例如:getSublistsWithFixedSize([1,2,3],2)返回[[1,2]、[1,3]、[2,3]]