Как рассчитать, сколько циклов нужно без циклов? - PullRequest
1 голос
/ 12 октября 2019

Если у меня есть значение A, которое увеличивается на 10% от его текущего значения, когда его забирает фиксированная величина B, как я могу рассчитать, сколько циклов потребуется для достижения 0 без фактического цикла?

Так вот, как бы я нашел его, выполнив цикл:

LoopsNeeded = 0
A = 100
B = 20
while A > 0:
   C = A * 0.1
   A = A + C
   A = A - B
   LoopsNeeded = LoopsNeeded + 1
print(LoopsNeeded)

В первом цикле:

initial values
A = 100
B = 20
-------
A > 0 = True
C = A(100) * 0.1 = 10
A = A(100) + C(10) = 110
A = A(110) - B(20) = 90
LoopsNeeded = 1
-------
A is now 90 on the next round of the loop

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

1 Ответ

3 голосов
/ 12 октября 2019

Пусть A i будет значением A после итерации i , где A 0 равно 100.

Давайте создадим рекурсивную формулу для A i :

A i = A i -1 · 1,1 - B

Если мы расширим его, мы получим:

A i = ( A i -2 · 1,1 - B ) · 1,1 - B = A i -2 · 1,1 2 - B · 1,1 - B
A i = ( A i −3 · 1.1 - B) · 1.1 2 - B · 1.1 - B = A i -3 · 1.1 3 - B · 1.1 2 - B · 1.1 - B
...
A i = A 0 · 1.1 i - B · (1.1 0 + 1.1 1 + ⋯ + 1.1 i -1 )

Итак:

A i = 100 · 1,1 i - 10 · B · (1.1 i - 1)

Или вообще:

A i = A 0 · (1 + p ) i - B · ((1 + p *)1186 *) i - 1) / p

Чтобы найти итерацию i , после чего A == 0, мы можем установить A i = 0 и решить для i :

0 = A i
0 = 100 · 1,1 i - 10 · B · (1,1 i - 1)
1.1 i = 10 · B · (1.1 i - 1)
i = log 1.1 ( 10 · B / (10 · B - 100) )

Или вообще:

i = log p + 1 ( - B / ( p · A 0 - B ) )

Для B = 20 это дает i = 7,2. Мы округлим и получим 8.

Время сложность O(1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...