За последние 24 часа нас посетили 56779 программистов и 1750 роботов. Сейчас ищут 884 программиста ...

Алгоритм поиска числа

Тема в разделе "PHP для новичков", создана пользователем plgv, 5 май 2017.

  1. plgv

    plgv Новичок

    С нами с:
    5 май 2017
    Сообщения:
    8
    Симпатии:
    0
    Есть данный алгоритм угадывания числа, которое рандомно загадал комп. Цикл не прерывается break`ом, при нахождении нужного числа.

    PHP:
    1. <?php
    2.    error_reporting(E_ALL);
    3.  
    4.    $compChoice = rand(0, 100);
    5.    $myChoice = 50;
    6.     $count = 25;
    7.  
    8.    function Check ($comp, $my) {
    9.       if ($comp === $my) {
    10.          return false;
    11.       } else if ($my > $comp) {
    12.          return 'Меньше';
    13.       } else if ($my < $comp) {
    14.          return 'Больше';
    15.       }
    16.    }
    17.  
    18.    while(1) {
    19.       $result = Check($compChoice, $myChoice);
    20.         if ($result === false) {
    21.            break;
    22.       }else if ($result === 'Меньше') {
    23.          $myChoice -= $count;
    24.       }else if ($result === 'Больше') {
    25.             $myChoice += $count;
    26.         }
    27.         $count = ceil($count / 2);
    28.         echo $result.';  myChoice:'.$myChoice.'; Count'.$count.'; CompChoice:'.$compChoice.'<br>';
    29.    }
    30. ?>
    Но если мы меняем цикл на данную конструкцию, то прерывание работает нормально.
    PHP:
    1. while(1){
    2.         $result = Check($compChoice, $myChoice);
    3.         if ($result === false) {
    4.             break;
    5.         }else if ($result === 'Меньше') {
    6.             $myChoice--;
    7.         }else if ($result === 'Больше') {
    8.             $myChoice++;
    9.         }
    10.     }
    Пробовал на JS, работает как надо. В чем проблема?
     
    #1 plgv, 5 май 2017
    Последнее редактирование: 5 май 2017
  2. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    На выходе, если деление не нацело, вы получаете float значение и сравниваете его с int значением, соответственно условие:
    не будет истинным.
    PHP:
    1. var_dump(1 === (float)1);
     
    plgv нравится это.
  3. plgv

    plgv Новичок

    С нами с:
    5 май 2017
    Сообщения:
    8
    Симпатии:
    0
    Спасибо, я думал ceil() возвращает int... *рукалицо*