PHP - Do (и echo) операция только тогда, когда остаток от 0 - Переход в бесконечный цикл - PullRequest
0 голосов
/ 14 декабря 2010

Позвольте мне начать с конца и актуальный вопрос:

Я пытаюсь написать PHP-скрипт, который из двух случайных чисел $x и $y будет выводиться и разрешаться только при модуляции == 0 (всегда должна отображаться действительная функция)

Что я имею в виду:

Скрипт эха:

4/2 => ХОРОШО!

Скрипт эха:

4/3 => ПЛОХО!

НИЧЕГО => ПЛОХО!


Я постараюсь провести вас через мои рассуждения, но будьте предупреждены:

Я новичок, поэтому: Я что-то изучаю, повышаю ставку и пытаюсь применить это удобно.


Сначала я генерирую случайные числа, просто:

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

Теперь я говорю, у меня есть две возможности после деления, остаток 0 или нет 0, так что выражение if () выглядит хорошей идеей, поэтому я делаю:

if ($ x% $ y == 0) {

эхо $ х. "/". $ У;

} еще {

echo "Остаток не равен 0";

}

Это работает как ожидалось за исключением, конечно, я всегда хочу сгенерировать этот остаток не 0 делений.

Таким образом, мой подход был следующий: почему бы не использовать пользовательские функции (никогда не использовал ранее, но мог бы пригодиться), поэтому, если я знаю, это прекрасно работает :

<?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();  
        
}
 
}
 
?>

Не работает , я получаю пустой экран.

Что я ожидал от этого сценария:

  • Создать функцию с оператором if ()
  • Если остаток равен 0, отлично, эхо.
  • иначе, начните все сначала, снова и снова, пока не получите разделение без остатка.

Это не работает.

Так что я в основном спрашиваю, что я делаю не так? Что не так с линией хотя бы позади этого?

Может ли это работать с небольшими изменениями?


Для опытных программистов я знаю, что вы все могли бы сделать скрипт, который делает это (но не имеет никакого отношения к моему), используя MS PAINT в качестве IDE, НО:

Меня не интересует сам код, поскольку он предназначен ТОЛЬКО для целей обучения.

Это не первый раз, когда это случается со мной, я продолжаю биться в стену бесконечными петлями ОЧЕНЬ часто, поэтому чем меньше изменение (и чем больше объяснение), тем лучше, и это будет очень высоко оценено.

Заранее спасибо!


Теперь, когда я закончил, я только что понял, что проблема может быть даже не в бесконечном цикле, даже если это еще не вопрос, что вы думаете о моем подходе? (конечно, я также отредактирую и уберу бесконечный цикл из вопроса)

Ответы [ 5 ]

3 голосов
/ 14 декабря 2010

Мне кажется, что вы устанавливаете только $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;
    }
?>
1 голос
/ 14 декабря 2010

Хорошо, давайте начнем с основ.

Причина, по которой ваше приложение ничего не отображает, заключается в том, что вы этого не сказали. Вы определили функцию, которая будет отображать что-то, но вы никогда не вызывали ее.

В основном вам нужно сделать следующее:

function foo() {
  // foo logic
}


foo();

Обратите внимание, как выполняется вызов foo вне самой функции в основной логике приложения.

Затем вам нужно перевести вызовы на mt_rand(), чтобы они были внутри вашей foo() функции, чтобы при каждом вызове генерировались новые случайные числа.

Наконец, вам не нужно совершать звонки на foo() с в течение foo(). Делать это разрешено, и это называется рекурсией, но здесь это действительно не нужно. Что вам нужно сделать, так это настроить вашу функцию так, чтобы она возвращала логическое значение (т. Е. True / false) после завершения функции, сообщая вам, что она сработала. Затем вы можете настроить цикл 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 голосов
/ 14 декабря 2010

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 не будет ложно. Разница между оператором while и do while заключается в том, что код выполняется перед проверкой условия.

0 голосов
/ 14 декабря 2010

В размещенной вами ссылке "Это не работает" вы не вызываете функцию foo ().

Пара замечаний:

  • убыть нулевым, так что вы можете получить ошибку «делить на ноль».
  • Вы используете рекурсию, и большую часть времени ваш код переходит в другой случай.Если ваша глубина вложения становится большой, вы можете столкнуться с переполнением стека.
0 голосов
/ 14 декабря 2010

Ваша проблема в том, что вы не переделываете $ x и $ y. Гипотетически, это должно войти в бесконечную рекурсию. Если вы хотите сделать это рекурсивно, вам нужно определить $ x и $ y в вашей функции foo (). Убедитесь, что переменные объявлены снаружи и перед оператором if ().

Удачи!
Деннис М.

...