【问题标题】:Php recursion issue not sending back valuesPHP递归问题不发回值
【发布时间】:2018-03-31 13:10:12
【问题描述】:

这是我之前发布的用于解决复杂问题的代码。 其背后的逻辑是 - 在递归的每次迭代中,函数应该将已经执行的 $amount 减少 $wa,并计算新的 $wa,以找到新的 $amount,直到系统无法在表中找到 $amount将比结果 $wa 更大,并作为最后一次迭代进行。 代码没有返回任何内容,当尝试开发它时,没有错误,没有回声。我做错了什么?

    $wa = 0.001;
    $address = $address;
    function recursion($wa)
    {
      $resulte = db_select ('Credit_user','c')
      ->fields ('c')
      ->range(0,1)
      ->orderby('cr_ts', 'ASC')
    ->condition('c.affected','0','=')
    ->condition('c.amount','0','!=')
     ->execute();
    foreach($resulte as $item) {
       $code = $item->redeem_code;
      global $code;
       $amounte = $item->amount;
      global $amounte; 
      $wai = $wa - $amounte;
    global $wai;
    if ($wai < 0){  
      echo "production code that should operate with different 
variations of $amounte and $redeem on last iteration";
      return;
    }
    elseif ($wai >= 0){  echo "production code 
that should operate with different variations 
of $amounte and $redeem on each iteration";

      return;

    } else {
      function recursion($wa){
    }
    }

    }}
    echo $amounte;
    echo "<br>";

【问题讨论】:

  • 在你的最后一个 else 中,尝试 recursion($wa) 而不是 function.....

标签: php mysql drupal


【解决方案1】:

至少这部分是错误的

} else {
   function recursion($wa){
}

应该是

} else {
   return recursion($wa);
}

但是这段代码的其余部分非常混乱,所以....

比如这个逻辑

if ($wai < 0){ 
   //... 
}elseif ($wai >= 0){
    //...
}else{
   //not reachable
   return recursion($wa);
}

相当有缺陷。因为无法访问 else 块。换句话说,没有什么能满足 else 条件,因为大多数值都通过 elseif,它的范围内有 10,而且 PHP 中的许多东西评估为 1{true}0{false} 因为 PHP 的松散类型。

更新

你可以自己测试这个条件

$tests = [
    false,
    -10,
    1,
    0,
    [],        ''
];

foreach($tests as $wai){
    if ($wai < 0){ 
       echo "1";
    }elseif ($wai >= 0){
        echo "2";
    }else{
       echo "3";
    }
    
    echo "\n"; 
}

输出

2
1
2
2
2
2

如您所见,没有来自else 块的#3,正如我所说,这是不可能到达的。因此,该函数不进行递归,因此不能从所述不存在的递归中返回任何内容。

测试一下online

另外:

$wai = $wa - $amounte;
global $wai;

必须先声明全局。

global $wai;
$wai = $wa - $amounte;

我们可以通过设置函数范围来测试它。

function foo(){
  $wai = 50;
  global $wai;
  echo $wai;
}

global $wai;
$wai = 100;    

foo();

现在人们会期望它打印50,但它会打印100。它是这样执行的:

  1. PHP 解析和解释代码
  2. 我们在函数外声明 global$wai
  3. 我们将 $wai 设置为 = 100(赋值)
  4. 我们调用函数foo
  5. 我们设置局部变量$wai = 50;
  6. 然后我们将$wai声明为全局,它从全局作用域(函数作用域外)继承了全局$wai的值,即100的值
  7. 然后我们回显该值。

这是您的代码非常接近的近似值,它在功能上等同于 Check it yourself

现在如果你改变顺序

function foo(){
  global $wai;
  $wai = 50;
  echo $wai;
}

global $wai;
$wai = 100;    

foo();

它输出50测试this

让我们看看,echo 函数需要更改才能返回。假设递归有效,但它没有。人们必须假设在某些时候它会被认为是我指出的 if 条件的其他两个部分之一。如果它不这样做,我们将无限递归,直到 PHP 用完内存并崩溃或达到最大执行时间。所以我们同意它必须通过这些。现在它怎么能从

返回任何东西
return recursion($wa);

如果其他两个返回都只是 return; 或返回 null。很自然,如果函数的下一次迭代将 null 返回到我们从递归调用所述函数返回的返回值,那么该调用也必须返回 null。

echo "production code that should operate with different variations of $amounte and $redeem on last iteration";
return; 

所以

return "production code that should operate with different variations of $amounte and $redeem on last iteration";

换句话说,它几乎都坏了。请不要采取这种错误的方式,我只是指出我看到的错误。每个人都必须从某个地方开始学习编码,我有近 8 年的专业网页设计和 PHP 编程经验。但是,我仍然记得学习是什么感觉,我仍然犯了很多错误。

我已经指出了可以解决的问题,但是对于 if 逻辑之类的问题,我无法弄清楚该逻辑应该是什么。我只能指出它崩溃的地方。

【讨论】:

  • $wai 是 ($wa - $amounte) 的结果,并且通常 'amount' 值小于 $wa,因此脚本应该执行到 ($wa - $amounte) 的值是负数,那么它应该为最后一次迭代计算不同的 $wai,而不是 ($wa - $amounte),而是 ($amoune - wa),即用于生产代码。而且几乎所有的值都是小数点后8位的小数,所以我需要它。
  • 执行 else 块需要什么值?
  • 哦,伙计,我非常感谢您的回答,您指出了很多错误,但为我提供了一个很好的解释,说明出了什么问题,以及我如何才能做得更好。我该怎样感谢你?
  • 让我数一数,{邪恶的笑容}。开个玩笑,我很无聊。没什么大不了的。
  • 这是我完成这个项目所要做的最后一件事,我做了这么多,这是我最后的挣扎。非常感谢您的帮助,对此我深表感谢。我在声明价值之前接受了你关于声明全局的建议,并尝试在递归函数中回显。但是我可能需要一些时间来考虑它,以后的解决方案会自行解决。谢谢你百万次,伙计。
猜你喜欢
  • 2015-02-04
  • 2010-12-08
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 2021-02-25
  • 2011-08-09
相关资源
最近更新 更多