PHP - 仅当余数为 0 时才执行(和回显)操作 - 进入无限循环

Posted

技术标签:

【中文标题】PHP - 仅当余数为 0 时才执行(和回显)操作 - 进入无限循环【英文标题】:PHP - Do (and echo) operation only when remainder from is 0 - Going into infinite loop 【发布时间】:2011-05-25 02:24:17 【问题描述】:

让我从结尾和实际问题开始:

我正在尝试编写一个 php 脚本,从两个随机数 $x$y 中,只有当模 == 0 时我们才会输出和解析(它应该始终回显一个有效函数)

什么意思:

脚本回显:

4 / 2 => 好!

脚本回显:

4 / 3 => 糟糕!

没什么 => 不好!


我会尝试引导您完成我的推理,但请注意:

我是一个新手,所以:我学到了一些东西,加大了赌注,并尝试方便地应用它。


首先我生成随机数,很简单:

$x = mt_rand(1,10);
$y = mt_rand(1,10);

现在我说,除法后我有两种可能性,余数为 0 或不为 0,所以 if() 语句看起来是个好主意,所以我这样做了:

如果($x % $y == 0)

回声 $x 。 “/”。 $y;

其他

echo "余数不为0";

This works as expected当然除了,我总是想生成这个余数不是0除法。

所以我的方法如下,为什么不使用用户生成的函数(以前从未使用过但可以派上用场)所以,如果我知道这个works just fine:

<?php
 
function hello()   
      echo "Hello!";  

 
hello();
?>

为什么不像我之前说的那样加大赌注并使用它,所以我混合起来:

<?php
$x = mt_rand(1,10);
$y = mt_rand(1,10);
 
function foo()
 
if($x % $y == 0)
 
echo $x . "/" . $y;
 
else
        
foo();  
        

 

 
?>

It doesn't work,我得到一个空白屏幕。

我对这个脚本的期望是什么:

创建一个带有 if() 语句的函数 如果余数为 0,则很好,回显。 否则,从头开始,一次又一次,直到你得到一个没有余数的除法。

这不起作用。

所以我基本上问,我做错了什么?这背后的虽然线有什么问题?

这可以通过细微的变化来工作吗?


对于有经验的编码人员,我知道你们都可以使用 MS PAINT 作为 IDE 来编写执行此操作的脚本(但与我的无关),但是:

我对代码本身不感兴趣,因为这仅用于学习目的。

这不是我第一次发生这种情况,我经常用无限循环撞墙,所以变化越小(解释越大)越好,将不胜感激。

提前致谢!


既然完成了,我刚刚意识到问题甚至可能不是无限循环,即使它不是问题仍然存在,你觉得我的方法怎么样? (当然我也会从问题中编辑和删除无限循环)

【问题讨论】:

【参考方案1】:

在我看来你只设置了$x$y 一次

这意味着当您递归调用 foo() 时,它们不会改变。我会先尝试这样的事情:

<?php
    function foo() 
        $x = mt_rand(1,10);
        $y = mt_rand(1,10);
        if ($x % $y == 0) 
            echo $x . "/" . $y;
         else 
            $x = mt_rand(1,10);    # need to recalculate them here.
            $y = mt_rand(1,10);
            foo();  
        
    
?>

不过,我会检查该代码。我对 PHP 的了解和对阿拉姆语的了解一样多:-) 我的分析更多地基于一般语言知识,所以语法可能是假的。

当然,在这种情况下,您可能需要考虑完全避免递归。真的没有必要。当递归使您的代码更优雅时,它很好,但我不认为这是这种情况。我会试一试这样的:

<?php
    function foo() 
        $x = mt_rand(1,10);
        $y = mt_rand(1,10);
        while ($x % $y != 0) 
            $x = mt_rand(1,10);
            $y = mt_rand(1,10);
        
        echo $x . "/" . $y;
    
?>

【讨论】:

所以 mt_rand 应该在 if() 里面? (说话的方式,因为我不想每次都生成不同的) 是的,否则它将继续使用相同的数字,因此 inf 循环 请注意,您不需要在 "else" 语句中第二次声明 $x 和 $y,因为它不会做任何事情。一旦你调用 foo();同样,$x 和 $y 将被重新声明为作用域,之前的 $x 和 $y 变量将被丢弃。 我明白你所说的,有道理,但我仍然得到一个空白屏幕。【参考方案2】:

好吧,让我们从基础开始吧。

您的应用程序没有显示任何内容的原因是您没有告诉它。您已经定义了一个可以显示某些内容的函数,但您从未真正调用过它。

基本上,你需要这样做:

function foo() 
  // foo logic



foo();

注意对 foo 的调用是如何在函数本身之外在应用程序的主线逻辑中进行的。

接下来,您需要将调用移动到mt_rand()您的foo() 函数中,这样每次调用都会生成新的随机数。

最后,您无需从 within foo() 调用 foo()。这样做是允许的,并且被称为“递归”,但这里真的不需要。您应该做的是设置您的函数,以便在函数完成时返回一个布尔值(即真/假),让您知道它有效。然后,您可以设置一个 while 循环来重复执行该函数,直到它正确完成。

这是一个例子:

function foo() 
  //define the random values
  $x = mt_rand(1,10);
  $y = mt_rand(1,10);

  //if they match, echo the statement and return true so the loop ends
  //otherwise, return false so the loop repeats
  if (($x % $y) == 0) 
    echo $x . "/" . $y;
    return true;
   else 
    return false;
  


//we're now *outside* of the function, and in mainline logic

//setup a variable to hold the return value of the function
//initialize it to false so that the first loop executes
$foundEquation = false;


//execute the function in a loop until we find
//the right equation
while(!$foundEquation)  
  $foundEquation = foo();

这是否回答了您的问题?如果您在理解这里发生的事情时遇到任何困难,请告诉我。我很高兴澄清有关此代码的任何内容。

【讨论】:

@AgentConundrum 现在谁在跟踪谁? :) @Akinator:该死!我什至没有注意到是你。我想我现在没有机会接受这个了……:P 该死,我忍不住了,开玩笑的,尽管代码 - 我认为 - 实际上并没有工作,但你帮助我充分了解了我的问题所在!谢谢!! @Akinator:我刚刚再次查看了代码。我认为问题在于我粗暴地指了一条作业线。而不是$foundEquation == foo();,它应该是$foundEquation = foo();(不是更新代码中的单个=,之前有两个) @Akinator:我已经更新了答案中的代码以纠正我的错误。【参考方案3】:

您的问题是您没有重新声明 $x 和 $y。假设,这应该进入无限递归。如果你想递归地这样做,你将不得不在你的 foo() 函数中定义 $x 和 $y 。确保在 if() 语句之外和之前声明变量。

祝你好运! 丹尼斯 M.

【讨论】:

【参考方案4】:

在您发布的“它不起作用”链接中,您没有调用函数 foo()。

几点说明:

y 可能为零,因此您可能会收到“除以零”错误。 您正在使用递归,并且大多数情况下您的代码将进入 else 情况。如果您的嵌套深度变大,您可能会遇到堆栈溢出。

【讨论】:

指向它的链接不起作用应该导致:ideone.com/SC5PE 你是什么意思我没有调用函数 foo()?如果$y = mt_rand(1,10);$y怎么可能是0?谢谢!!【参考方案5】:

Paxdiablo 是在正确的轨道上,但这是你可能想要的:

<?php
    function foo() 
        do
        
            $x = mt_rand(1,10);
            $y = mt_rand(1,10);
        
        while ($x % $y != 0);

        echo $x . "/" . $y;
    
?>

这将循环执行 do while 中的代码,直到 while 条件为 false。 while 和 do while 的区别在于代码在条件检查之前执行。

【讨论】:

谢谢!这是布赖恩的建议:***.com/questions/4436441/…

以上是关于PHP - 仅当余数为 0 时才执行(和回显)操作 - 进入无限循环的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 访问 MS SQL 视图和回显结果

仅当列存在时才执行 dplyr 操作

如何在保持格式的同时从数据库中检索和回显文本[重复]

仅当 pr 目标为 master 时才运行 GitHub 操作

仅当 Access 2007 中不存在时才添加记录

SpringBoot+ajax+formData实现图片上传和回显