Pull to refresh

Comments 39

наверное, все чётные числа стоят на позициях кратных 3

Эмпирически? Догадка?
ЛОЛ. Нечетные числа всегда в сумме своей дают четное. А нечетное с четным — нечетное.
Или я не понял и эта статья — стёб на тему «доказываем простое сложно»?
Нет — это я балбес) спасибо, добавил в статью
Это ж очевидно. На этом доказательную часть можно было бы и закончить :)
Even[0]=2;
Even[1]=8;
for(int i=2;i<N; i++) {
   Even[i]=Even[i-1]*4 + Even[i-2];
}

Так тоже можно
Спасибо, добавил в конец секции «Алгоритм»
Более того, это обобщается. Любую t-подпоследовательность (составленную из чисел, стоящих на местах, кратных t) Фибоначчи можно выразить через ее саму. Смотрите
t = 1: F(n) = F(n-1) + F(n-2) — сама последовательность Фибоначчи
t = 2: F(2*n) = 3*F(2*(n-1)) — F(2*(n-2))
t = 3: F(3*n) = 4*F(3*(n-1)) + F(3*(n-2))
t = 4: F(4*n) = 7*F(4*(n-1)) — F(4*(n-2))
t = 5: F(5*n) = 11*F(5*(n-1)) + F(5*(n-2))

Обобщая, имеем
F(t*n) = a(t)*F(t*(n-1)) + (-1)^(t+1)*F(t*(n-2))

Нетрудно видеть, что последовательность a(t) также является последовательностью a-la Фибоначчи, с базой 1, 3: 1,3,4,7,11,18…
Для t>=3 справедливо a(t) = 2*F(t) + F(t-3) (полагая F(0) = 0).

Доказать, думаю, по индукции вполне возможно, просто вывод долгий получится.
a(t) лучше переписать в виде a(t)=F(t)+2F(t-1), тогда оно будет определелено для всех t>=1

Идея интересная, попробую придумать доказательство покороче)
Да, действительно.
Я попробовал в лоб вывести через равенство
F(n+t) = F(t)*F(n+1) + F(t-1)*F(n)
Но приехал к остаточному члену
F(t-2)*F(n) — F(t)*F(n-2)
Возможно, уже есть известное равенство для таких выражений?
Я доказал индукцией, вставил в статью в конец секции «Обобщение», спасибо)

Остался вопрос, на сколько вообще актуально знание математики для программиста PHP? Почему-то мне кажется, что такое знание математики требуется в единичных случаях. Больше необходимы умения связать несвязуемое, там 1С прицепить к сайту, плагин для магазина какой добавить...

У вас слишком ограниченное видение работы программистом, на php так же пишутся большие приложения, а не только связывают не связуемое и не впихуемое

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

Из всего пласта математики, преподанного в универе, в веб-разработке пригодилась только пару раз дискретная математика (графы и конечные автоматы) и немного тервер. Остальная огромная часть математики полезна, но как общее развитие мышления.
Бэкэнд в онлайн-игрушках (браузерки и флеш — точно) нередко пишут на PHP, если там прокрадываются элементы геймдизайна, то знание математики будет полезным.
По-хорошему, геймдизайнер в таких случаях должен предоставить формулы или алгоритм. От разработчика знание подобных вещей нужно, скорее, для увеличения производительности.
Вы используете математику каждый раз, когда задумываетесь о том, правильно ли работает программа. То есть когда пишите её, когда ищете баги, когда читаете чужой код. Потому что во всех этих случаях вам приходится рассуждать. Мысленно доказывать леммы и теоремы об этом коде, искать противоречия, находить контрпримеры. В общем, как мольеровский Мещанин — вы говорите прозой, но не догадываетесь об этом :)))
Является ли это той математикой, о которой идёт речь в статье, или это всё же ближе к логике и алгоритмике?
Так-то уборщица тоже использует химию, при мытье полов и физику, когда отдирает прилипшую жвачку, а математику при подсчёте своей зарплаты.
И да, я не хочу ни сколько принизить профессию программиста, да и уборщицы тоже. Мне просто кажется, что зачастую подобные требования выдвинутые работодателями не совсем адекватны.
Для решения этой задачи не требуется ничего, кроме способности совершать логические умозаключения. Автор статьи пошёл в ней гораздо дальше того, что требовалось в задаче. Сомневаюсь, что авторы задачи требовали от него чего-то большего, чем подсчёта N-го числа и проверки его на чётность. Не rocket science.
А можете больше подробностей в личку прислать? На каком девайсе/ос/браузере не работает.
У меня в ios/chrome формулы отображаются.
Уже все заработало, не знаю, с чем связано)

На всякий случай: Xiaomi Redmi Note 4x, Chrome 73.0.3683.90, включая отображение версии для ПК.
… А потом оказалось, что потенциальный работодатель чётными числами называет числа, стоящие на чётных местах (2-е, 4-е, 6-е, ...)?
Значит можно сказать — потенциальный работодатель не умеет давать чёткие ТЗ
Значит можно сказать — потенциальный работодатель не умеет давать чёткие ТЗ

… Добро пожаловать в реальный мир :) Не знаю, на счет работодателей, но подавляющее большинство Заказчиков не умеет давать четкие ТЗ и предпочитают играться с формой квадрата.
А почему никто не заметил, что это можно сделать проще? Учитывая, что мы знаем, что четным является каждое третье число. Каждое третье число равно текущее умноженное на 4 плюс предыдущее.
2 * 4 + 0 (перед единицей, очевидно, идет ноль) = 8
8 * 4 + 2 = 34
34 * 4 + 8 = 144
144 * 4 + 34 = 610
610 * 4 + 144 = 2584
и тд, думаю, задумка ясна.
существуют ли ещё чётные числа Фибоначчи чей номер не кратен 3?

После чего идет несколько абзацев выкладок, чтобы это доказать. При том, что выше уже выписано равенство из которого это тривиальным образом следует:
F_{n+3} = 2F_{n+1} + F_n
Если F_n — нечетное, то F_{n+3} — тоже нечетное. Остается лишь проверить четность двух первых чисел ряда.
Упустил, спасибо, добавил в статью
UFO just landed and posted this here
Кстати, есть ещё одна прикольная задача про сумму первых n четных чисел Фибоначчи, которая решается за О(1). Сумма чисел Фибоначчи от 1 до 3n равна числу Ф. с номером 3n + 2, с другой стороны это удвоенная сумма первых n четных чисел Ф. т. к. каждое чётное равно сумме двух предыдущих, а они как раз идут группами по три. То есть ответ что-то вроде F(3n+2) / 2, который считается напрямую по формуле Бине.
Мнится мне, что работодатель, говоря про Фибоначчи, имел в виду рекурсию. А в рекурсию могут не только лишь все…
Мнится мне, что программисты должны работать по ТЗ, а не догадками, кто там что имел в виду.

Вот если примут на работу, дадут ТЗ. А это был тест на наличие компетенций. И человек его не прошел. Потому что не все задачи решаются в лоб. Через цикл for.

А сколько начнёт кушать памяти «компетентное» рекурсивное решение не в лоб через пару тысяч итераций?
Вот сейчас сижу и думаю, наверное все-таки из-за Фибоначчи пролетел

Я так и не понял, почему. Если задача действительно стояла так, как описано в письме (выбрать все четные числа Фибоначчи в диапазоне от 1 до 10000), то решение пишется за две минуты:


def fib():
    a, b = 1, 1
    yield a
    while True:
        yield b
        a, b = b, a + b

def even_fib(n=10000):
    for i in fib():
        if i > n:
            return
        if i % 2 == 0:
            yield i

И именно такое решени, написанное за две минуты, является верным и самым подходящим, потому что корректно решает задачу минимальными ресурсами. И даже выполняется за смешное время:


In [3]: %time list(even_fib())
Wall time: 15.7 µs
Out[3]: [2, 8, 34, 144, 610, 2584]

Даже для больши́х значений:


In [5]: %time list(even_fib(10**30))
Wall time: 54.8 µs
Out[5]: [2, 8, 34, 144, 610, 2584, 10946, 46368, 196418, 832040, 3524578, 14930352, 63245986, 267914296, 1134903170, 4807526976, 20365011074, 86267571272, 365435296162, 1548008755920, 6557470319842, 27777890035288, 117669030460994, 498454011879264, 2111485077978050, 8944394323791464, 37889062373143906, 160500643816367088, 679891637638612258, 2880067194370816120, 12200160415121876738, 51680708854858323072, 218922995834555169026, 927372692193078999176, 3928413764606871165730, 16641027750620563662096, 70492524767089125814114, 298611126818977066918552, 1264937032042997393488322, 5358359254990966640871840, 22698374052006863956975682, 96151855463018422468774568, 407305795904080553832073954, 1725375039079340637797070384, 7308805952221443105020355490, 30960598847965113057878492344, 131151201344081895336534324866, 555565404224292694404015791808]

Без дополнительных условий, любые исследования и попытки оптимизировать — бесполезная трата рабочего времени.


Что конечно не уменьшет интересность статьи, если отойти от просто решения тестового задания.

Наверное вы не смотрели оригинальный пост или уже забыли) там всесторонне рассматривались способы вычисления N-ого числа Фибоначчи, ну и юзернейм этим комментарием как бы иронизировал, что наверное в этой самой простой задаче собака то и была зарыта. А так вы все правильно заметили в 99% случаев чем проще решение, тем лучше, а основное назначение этого поста — жвачка для мозгов.
Прелесть этого примера еще и в том, что он не будет работать на PHP, если его перевести как есть.

Дело в том, что в PHP числа только до 64 бит точности. А дальше они становятся double, у которых не проверить четность из-за маленького диапазона.

А в Питоне числа безразмерные

In [16]: print(10**100 + 1)                                                                                                     
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001


В PHP же нестрогая типизация, там скорее всего получится что-то такое:

php > print(10**30 + 1);
"десять в тридцатой один"
Там ограничение на значение чисел Фибоначчи, а не на их номер, поэтому будет работать. Если изменить задачу и поставить ограничение в 10000 на количество чисел, то да, надо будет подключать длинную арифметику.

Самое смешное было как то такое же тз. Фибоначи, запрос с др, и третье найти количество белых пикселей на изображении,
К третьему заданию придрались, и я ещё написал два разных способа и доказал через картинку созданную самим php что количество пикселов считает верно. Фибоначи нашёл какой то пример в мане про генераторы, запрос сам составил. Оказывается это стандартный набор). Я отказался, так как удалёнка. Типо я прошёл

Sign up to leave a comment.

Articles