PHP-Do(和echo)操作仅在0的余数进入无限循环时进行

PHP-Do(和echo)操作仅在0的余数进入无限循环时进行,php,function,logic,infinite-loop,division,Php,Function,Logic,Infinite Loop,Division,让我从结尾和实际问题开始: 我正在尝试编写一个PHP脚本,从两个随机数$x和$y中,只有当模==0时,我们才会输出并解析它们(它应该总是回显一个有效的函数) 我的意思是: 剧本呼应: 4/2=>很好 剧本呼应: 4/3=>糟糕 没什么不好 我将尝试引导您完成我的推理,但请注意: 我是个新手,所以:我学到了一些东西,提高了赌注,并尝试着方便地应用它。 首先,我生成随机数,很简单: $x = mt_rand(1,10); $y = mt_rand(1,10); 现在我说,除法之后有两种可能性,

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

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

我的意思是:

剧本呼应:

4/2=>很好

剧本呼应:

4/3=>糟糕

没什么不好


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

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


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

$x = mt_rand(1,10);
$y = mt_rand(1,10);
现在我说,除法之后有两种可能性,余数0或不是0,所以if()语句看起来是个好主意,所以我这样做:

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

echo$x.“/”$y

}否则{

回显“余数不是0”

}

当然,我总是希望生成这个余数不是0个除法

因此,我的方法如下,为什么不使用用户生成的函数(以前从未使用过,但可以派上用场),因此,如果我知道这一点:


为什么不像我之前说的那样提高赌注并使用它,所以我混合了:

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

,我得到一个空白屏幕

我期望从这个脚本中得到什么:

  • 创建一个带有if()语句的函数
  • 如果余数为0,那么很好,echo
  • 否则,从头开始,一次又一次,直到你得到一个没有余数的除法
这不管用

所以我基本上会问,我做错了什么?这背后的思路有什么问题

这能在微妙的变化下起作用吗


对于有经验的程序员,我知道你们都可以使用MS PAINT作为IDE编写一个脚本来实现这一点(但与我无关),但是:

我对代码本身没有兴趣,因为这只是为了学习

这已经不是第一次发生在我身上了,我经常用无限的循环撞击墙壁,所以变化越小(解释越大)越好,我将非常感激

提前谢谢



现在我已经意识到这个问题甚至可能不是一个无限循环,即使它不是问题仍然存在,你觉得我的方法怎么样?(当然,我还将编辑并删除问题中的无限循环)

在我看来,您只设置了
$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;
    }
?>


在我看来,您只设置了
$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;
    }
?>

您的问题是没有重新定义$x和$y。假设,这个应该进入无限递归。如果要递归地执行此操作,必须在foo()函数中定义$x和$y。确保变量在if()语句之外和之前声明

祝你好运

丹尼斯M.

你的问题是你没有重新定义$x和$y。假设,这个应该进入无限递归。如果要递归地执行此操作,必须在foo()函数中定义$x和$y。确保变量在if()语句之外和之前声明

祝你好运
Dennis M.

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

几点注意:

  • y可能为零,因此您可能会得到“除以零”错误
  • 您使用的是递归,大部分时间您的代码都会使用else。如果嵌套深度变大,可能会遇到堆栈溢出
在您发布的“它不工作”链接中,您没有调用函数foo()

几点注意:

  • y可能为零,因此您可能会得到“除以零”错误
  • 您使用的是递归,大部分时间您的代码都会使用else。如果嵌套深度变大,可能会遇到堆栈溢出

    • 好的,让我们从基础开始

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

      基本上,您需要这样做:

      function foo() {
        // foo logic
      }
      
      
      foo();
      
      请注意,对foo的调用是如何在函数本身之外、在应用程序的主线逻辑中进行的

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

      最后,您不需要从
      foo()
      中调用
      foo()
      。这样做是允许的,并且被称为“递归”,但这里确实不需要它。你应该做的是
      <?php
          function foo() {
              do
              {
                  $x = mt_rand(1,10);
                  $y = mt_rand(1,10);
              }
              while ($x % $y != 0);
      
              echo $x . "/" . $y;
          }
      ?>