2010-12-14 14 views
0

讓我最終和實際的問題開始:PHP - DO(和迴音)操作,只有當剩餘的爲0 - 走進無限循環

我試圖寫一個PHP腳本,從兩個隨機數字$x$y只會我們輸出,當模== 0(它應該始終呼應有效的功能)解決

這是什麼意思:

腳本回聲:

4/2 =>好!

腳本回聲:

4/3 =>壞!

NOTHING => BAD!


我會盡力來指導你通過我的推理,但要注意:

我是新手,所以:我學到東西,提高賭注,並儘量方便地應用它。


首先,我產生的隨機數,容易:

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

現在我說,我有分工,餘數爲0後兩種可能性或不爲0,那麼一個if()語句看起來像好主意,所以我做的:

如果($ X%$ Y == 0){

回聲$ X。 「/」。 $ Y;

} else {

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塗料作爲一個IDE,但是:

我在毫無興趣代碼本身,因爲這只是爲了學習的目的。

這不是第一次發生在我身上,我經常碰到無限循環的牆,所以變化越小(解釋越大)越好,並且會非常感激。

在此先感謝!


現在完成我剛剛意識到這個問題甚至可能不是一個無限循環,即使它不是問題仍然有效,你有什麼感想覺得我的做法呢? (當然我也將修改,然後從問題中刪除無限循環)

回答

1

好的,讓我們從基礎開始。

你的應用程序沒有顯示任何東西的原因是你沒有告訴它。你已經定義了一個函數來展示一些東西,但你從來沒有真正調用它。

基本上,你需要這樣做:

function foo() { 
    // foo logic 
} 


foo(); 

注意如何調用FOO由外的函數本身,在應用程序的邏輯主線。

接下來,您需要將您的呼叫轉移到mt_rand()裏面foo()功能,使新的隨機數將在每次調用生成。

最後,您不需要撥打電話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(); 
} 

是否回答你的問題?如果您對於此處發生的事情有任何疑問,請告訴我。我很高興澄清關於此代碼的任何內容。

+0

@AgentConundrum現在誰跟蹤誰? :) – Trufa 2010-12-14 06:36:48

+0

@Akinator:該死的!我甚至沒有注意到它是你。我想現在沒有機會得到這個接受...:P – AgentConundrum 2010-12-14 06:44:42

+0

不,不是一個機會:) – Trufa 2010-12-14 06:53:21

3

它看起來像你對我只設置$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以及我所知道的Aramaic :-)我的分析更多地基於一般的語言知識,因此語法可能是假的。

當然,在這種情況下,您可能想要完全避免遞歸。真的不需要它。當它使你的代碼更優雅時遞歸是好的,但我不認爲這是這種情況。我會給這樣一個鏡頭:

<?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; 
    } 
?> 
+0

所以mt_rand應該在if()裏面嗎? (發言的方式,因爲我不想每次都生成不同的) – Trufa 2010-12-14 06:21:57

+0

是的,否則它會繼續使用相同的數字,因此inf循環 – 2010-12-14 06:22:35

+0

請注意,您不需要第二次聲明$ x和$ y 「else {}」語句,因爲它不會做任何事情。一旦你調用foo();再次,$ x和$ y將被重新聲明爲範圍,並且之前的$ x和$ y變量將被丟棄。 – RageD 2010-12-14 06:27:25

0

你的問題是,你沒有重新聲明$ x和$ y。假設,這應該進入無限遞歸。如果您想遞歸執行此操作,您將不得不在foo()函數中定義$ x和$ y。確保變量是在if()語句之前和之前聲明的。

祝你好運!
Dennis M.

0

在您發佈的「It does not work」鏈接中,您沒有調用函數foo()。

有兩點要注意:

  • y可以是零,所以你可能會「被零除」的錯誤得到。
  • 您正在使用遞歸和大部分時間您的代碼將進入else情況。如果您的嵌套深度變大,您可能會遇到堆棧溢出。
+0

鏈接到它不起作用應該導致:http://ideone.com/SC5PE你是什麼意思我不是調用函數foo()?如果'$ y = mt_rand(1,10);'?怎麼能'$ y'be 0?謝謝!! – Trufa 2010-12-14 06:47:41

0

Paxdiablo是在正確的軌道上,但是這就是你可能想:

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

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

這將循環執行代碼的裏面做的{}一段時間,直到while條件爲false。一段時間和一段時間之間的區別在於代碼在檢查條件之前執行。

+0

謝謝!這是布賴恩建議:http://stackoverflow.com/questions/4436441/php-do-and-echo-operation-only-when-remainder-from-is-0-going-int-infinite/4436523#4436523 – Trufa 2010-12-14 07:11:53