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 时才执行(和回显)操作 - 进入无限循环的主要内容,如果未能解决你的问题,请参考以下文章