Напишите более быструю функцию цикла в JavaScript из-за истечения времени выполнения - PullRequest
0 голосов
/ 12 мая 2018

Мой друг Джон любит ходить в кино.Он может выбирать между системой A и системой B.

Система A : каждый раз покупать билет (15 долларов)

Система B : покупатькарту (500 долларов) и каждый раз покупайте билет, цена которого в 0,90 раза превышает цену, которую он заплатил за предыдущий.

Пример: если Джон идет в кино 3 раза:

    System A : 15 * 3 = 45
    System B : 500 + 15 * 0.90 + (15 * 0.90) * 0.90 + (15 * 0.90 * 0.90) * 0.90 
    ( = 536.5849999999999, no rounding for each ticket)

Джон хочет знать, сколько раз он должен ходить в кино, чтобы конечный результат Системы B, при округлении до следующего доллара, был дешевле, чем у Системы A.

Функциональный фильмимеет 3 параметра: card (цена карты), ticket (обычная цена билета), perc (часть того, что он заплатил за предыдущий билет) и возвращает первый n такой, что

ceil(price of System B) < price of System A.

Дополнительные примеры:

movie(500, 15, 0.9) should return 43 
    (with card the total price is 634, with tickets 645)
movie(100, 10, 0.95) should return 24 
    (with card the total price is 235, with tickets 240)

Я написал этот код, но получил сообщение об истечении времени ожидания на веб-странице.Может кто-нибудь предложить мне, как я могу написать более быстрый код, чем этот?

   function movie(card, ticket, perc) {
var WithTicketPrice = 0;
var WithCardPrice = card+ticket*perc;
var Counter = 1;

while (WithTicketPrice <= Math.ceil(WithCardPrice)) {

      WithTicketPrice = WithTicketPrice + ticket;

      WithCardPrice = WithCardPrice + (ticket*Math.pow(perc, Counter)*perc);
      Counter++;

    }

  return Counter-1;

};

1 Ответ

0 голосов
/ 12 мая 2018

Ваши критерии выхода, вероятно, никогда не будут соответствовать указанному вами коду, потому что вы увеличиваете WithCardPrice на ticket в квадрате. Таким образом, WithTicketPrice будет не только начинать с понижения, но всегда будет все меньше, учитывая ticket > 1.0 и card > 1.0.

Полагаю, вы хотели написать

WithCardPrice = WithCardPrice + ticket * (1 + i * perc);

или что-то в этом роде?

...