За последние 24 часа нас посетили 22734 программиста и 1268 роботов. Сейчас ищут 800 программистов ...

Цикл do...while долго обрабатывается

Тема в разделе "PHP для новичков", создана пользователем roboformation, 30 авг 2020.

  1. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    PHP:
    1. function sqInRect ($lng, $wdth) {
    2.   if ($lng == $wdth) {
    3.     return null;
    4.   }
    5.   $S = $lng * $wdth;
    6.   $sum = 0;
    7.   $square = min ($lng, $wdth) ** 2;
    8.   while (1) {
    9.     $sqrt = sqrt ($square);
    10.     $diff = $S - $sum;
    11.     $i = 0;
    12.     $floor = floor ($diff/$square);
    13.     while ($i < $floor) {
    14.       $sum += $square;
    15.       $arr [] = $sqrt;
    16.       $i++;
    17.     }
    18.     if ($sum == $S) {
    19.         return print_r ($arr);
    20.     }
    21.     $diff = $S - $sum;
    22.     do {
    23.        $diff--;
    24.     } while (is_float (sqrt ($diff)));
    25.     $square = $diff;
    26.   }
    27. }
    28. sqInRect (3,5);
    Почему-то, когда функция выполняется, цикл do...while обрабатывается больше 60 сек в строках 23 и 24. Хотя я прогнал аргументы (3 и 5), и всё должно быть нормально. Но я не уверен
     
    #1 roboformation, 30 авг 2020
    Последнее редактирование: 30 авг 2020
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    может sqrt долго считает, отдельно посмотри какие там значения и сколько времени они считаются
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А зачем вообще такую хрень писать? Вспоминаем алгебру, область определения квадратного корня. Квадратный корень определён для всех значений больше или равно нуля. А для отрицательных чисел уже возвращает комплексный результат (функция sqrt этого не умеет).
    --- Добавлено ---
    Что вообще пытаешься сделать таким способом?
     
  4. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    Найти следующее, меньшее число, которое при выносе из корня получает целое значение
     
  5. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    sqrt возвращает всегда float-тип. Это и есть причина
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А каким местом is_float имеет отношение к целому значению?
     
  7. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
    Я уменьшал целое число, пока не нашёл бы целое число, которое при выносе из корня возвращало бы целое значение, но если бы оно возвращало дробное значение, цикл бы продолжался. Однако я не учёл тот факт, что sqrt всегда возвращает дробное значение (даже если оно выглядит, как целое) и попал в ловушку.