|
09.02.2017, 20:04 | #1 |
Участник
|
Помню дали задачку, вывести ряд Фибоначи. Нарисовал рекурсию. Не понравилось. Видать не поняли.
|
|
09.02.2017, 20:58 | #2 |
Участник
|
А по моему логично....в ТЗ именно так сказано - "каждое последующее число равно сумме двух предыдущих чисел"....и почему не рекурсия А про глубину стека пусть постановщик ТЗ думает.....
__________________
любитель портвейна и снов с прокисшей капустой в усах |
|
|
За это сообщение автора поблагодарили: Silence (1). |
11.02.2017, 12:51 | #3 |
Участник
|
|
|
09.02.2017, 21:06 | #4 |
Участник
|
Цитата:
Кеширование конечно хорошо, но бесполезно. Ибо ряд бесконечен и программа все равно упадет из-за переполнения. Или Вы предлагаете после достижения результата в N-1 знаков, где N = кол-во не влезающее в память, разбивать результат на части и обсчитывать их отдельно, после чего выводить потоком на экран? (Точнее на бумажку, так как предлагалось писать код на листе А4) А потом так же поступать и с отдельными частями результата ибо и они переполнятся. А это рекурсия. Цитата:
Единственный логичный выход, по моему, это сделать так же. Удалиться. ) Видится мне код из трех строчек включая декларативную часть с тремя десятками комментариев...
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) Последний раз редактировалось Silence; 09.02.2017 в 21:43. |
|
09.02.2017, 23:16 | #5 |
Участник
|
)))))
Цитата:
Спасибо за разъяснения. Свое мнение не изменил. |
|
09.02.2017, 23:35 | #6 |
Участник
|
Т.е. Вы считаете, что для бесконечного цикла нужно писать нечто вроде:
X++: while (true) Или Вы думаете, нужно было объяснить, что задача поставлена не верно? Сомневаюсь, что ждали именно этого. ЗЫ. Наверное это не то место для таких дискуссий
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) |
|
10.02.2017, 00:50 | #7 |
Участник
|
Я знаю, что эта задача является классической.
Разбирается во всевозможных статьях. Начиная от школьных обучающих курсов до многотомника Кнута. Сходу можно привести 4-5 решений. Где-то видал статью с 15 способами. Один из них, где время расчета меньше O(n). рекурсию привести конечно можно. но оговорив область применимости, влияние повторных расчетов на производительность и прочие недостатки. while(true)... му-ха-ха-ха!!!! хороший панк-юмор да, это один из способов решения. в памяти хранятся только два последних значения, повторных вычислений нет, время выполнения линейное. момент, который не оговорен - целочисленные значения. для такого случая было бы хорошо оговорить область применимости ))) в обычных системах, скорее всего, выполнение прервется по переполнению раньше, чем пользователь нажмет CTRL + BREAK/ в аксапте приведенный алгоритм, скорее всего, будет просто выдавать неправильные (отрицательные) значения начиная с некоторого числа, причем достаточно близкого к началу последовательности. если программист не оговорил хотя бы в комментарии область применимости... и не предупредил, что она будет настолько маленькой... с точки зрения аксапты, я бы обратил внимание, что автор использует int2str вместо strfmt. Это была бы тема для дополнительных вопросов. свое мнение не изменил - мне бы тоже не понравилось. Последний раз редактировалось mazzy; 10.02.2017 в 01:05. |
|
14.02.2017, 06:12 | #8 |
NavAx
|
Сложно сказать чего они ждали. Это могла быть тупая задачка из букваря, а мог быть завуалированный вопрос:"какие ассоциации вызывает у вас слово рекурсия?"
__________________
Isn't it nice when things just work? |
|
10.02.2017, 12:06 | #9 |
Участник
|
Так это задача программиста выбрать подходящий способ решения. Рассмотреть несколько возможных вариантов решений, оценить их плюсы и минусы и задать уточняющие вопросы. Постановщик может не знать об ограничениях, или умышленно умолчать, чтобы посмотреть, как человек будет выкручиваться при недостатке информации и нечетких требованиях.
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
11.02.2017, 18:57 | #10 |
Участник
|
"Большие числа" - это как раз то, о чем говорил Silence в самом начале
Цитата:
Сообщение от Silence
Кеширование конечно хорошо, но бесполезно. Ибо ряд бесконечен и программа все равно упадет из-за переполнения. Или Вы предлагаете после достижения результата в N-1 знаков, где N = кол-во не влезающее в память, разбивать результат на части и обсчитывать их отдельно, после чего выводить потоком на экран? (Точнее на бумажку, так как предлагалось писать код на листе А4) А потом так же поступать и с отдельными частями результата ибо и они переполнятся. А это рекурсия.
Но я бы очень внимательно смотрел на повторные вычисления и на переполнение. чтобы понять, что кандидат понимает проблему. "на листочке" вполне хватило бы комментария // функция применима для 30-60 первых чисел Наивный рекурсивный код {... result = fib(n-1) + fib(n-2)} делает слишком много повторных вычислений. для "листочка" хватило бы простого кэширования уже полученных чисел. или изящного решения, о котором я конечно же забыл, и которое показал Андре в этой ветке - передается больше параметров в стек, но полностью и ультимативно решается вопрос повторных вычислений в рекурсии. или решения через итерацию и хранение в памяти только двух последних чисел, как показал Ace of Database. Последний раз редактировалось mazzy; 11.02.2017 в 19:14. |
|
10.02.2017, 00:14 | #11 |
Участник
|
Прочитал, что такое "Фибоначчи" в википедии и написал такой джоб. В аксапте не проверял
Прерывается через CTRL + BREAK/ Без рекурсии. X++: x = 0; y = 1; info(int2str(x)); info(int2str(y)); while (true) { info(int2str(x + y)); [x, y] = [y, x + y]; } |
|
10.02.2017, 12:56 | #12 |
Участник
|
Задача была вывести ряд Фибоначчи. Человек справился. Но я бы тоже на их месте подумал, стоит ли брать к себе человека, решающего задачи путем рекурсии.
"Шурик, вы комсомолец? Это же не наш метод!" ©
__________________
// no comments |
|
10.02.2017, 13:05 | #13 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Diman (1). |
10.02.2017, 14:07 | #14 |
Участник
|
Замечу, что решение с помощью рекурсии является точной имплементацией определения чисел Фибоначчи.
На одном собеседовании я показывал ещё два способа, с помощью которых можно решить эту задачу, хотя начал с рекурсии. В идеале, конечно, лучше писать быстро, чисто, выразительно, с оптимальной сложностью, с видением всех подводных камней, но, я считаю, что в первом приближении задачу лучше решить хорошо, а потом уже заниматься оптимизацией. |
|
|
За это сообщение автора поблагодарили: ta_and (3). |
10.02.2017, 14:17 | #15 |
Участник
|
Цитата:
числа фибоначчи определяются через золотое сечение. именно этим они и интересны. рекуррентная последовательность - это следствие из определения. кстати, именно возврат к исходному определению через золотое сечение и позволяет перейти от суммирования последовательности к умножению матриц достигнуть производительности < O(n) https://ru.wikipedia.org/wiki/%D0%A7...87%D1%87%D0%B8 Последний раз редактировалось mazzy; 10.02.2017 в 14:24. |
|
10.02.2017, 15:59 | #16 |
Участник
|
Цитата:
Сообщение от mazzy
конечно же нет.
числа фибоначчи определяются через золотое сечение. именно этим они и интересны. рекуррентная последовательность - это следствие из определения. кстати, именно возврат к исходному определению через золотое сечение и позволяет перейти от суммирования последовательности к умножению матриц достигнуть производительности < O(n) https://ru.wikipedia.org/wiki/%D0%A7...87%D1%87%D0%B8 Из той же статьи: Цитата:
Более формально, последовательность чисел Фибоначчи задаётся линейным рекуррентным соотношением.
Цитата:
In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation.
Приведённое определение через матрицы и определители отсылает нас к значениям континуант на наборе единиц, которые в свою очередь определяются рекуррентным соотношением. И я очень сомневаюсь, что математики древней Индии знали что такое матрица, что такое определитель матрицы, символ кронекера и как перемножать матрицы, так как соответствующая теория сформировалась в конце 17-го-середине 18-го веков. По-моему, если уж так хочется обсудить теорию алгоритмов и теорию сложностей, то для этого есть более и практические задачи типа сортировки или поиска или графов. Но при чём тут система ценностей? Исходя из моего опыта, у большинства работодателей есть только одна система ценностей: скорость работы, а качество кода, его выразительность, оптимизация не так уж важны. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
10.02.2017, 16:09 | #17 |
Участник
|
Лайк
Цитата:
я говорил: "числа фибоначчи определяются через золотое сечение" я говорил: "рекуррентная последовательность - это следствие из определения." я полностью согласен с тем, что числа Фибонначчи ЗАДАЮТСЯ через рекурентную формулу. я никогда не говорил про "определение через матрицы". я говорил, что можно свести к возведению в степень и умножению матриц и получить очень быстрое вычисление. Цитата:
Сообщение от AP-1055D
Кроме чисел Фибоначчи есть расширение этого кольца до чисел трибоначчи, которые также определяются через рекурсию.
2. через рекурсию они задаются/выводятся, а не определяются. Цитата:
Но почему ИЛИ-ИЛИ? Можно и то, можно и другое... Цитата:
И вы утверждаете, что для вас работодатели не применяют систему ценностей - качества кода, выразительность, оптимизация? А почему, как вы думаете? Последний раз редактировалось mazzy; 10.02.2017 в 16:15. |
|
10.02.2017, 19:36 | #18 |
Участник
|
Цитата:
То есть, да, качество кода и всё остально тоже важно, но не на первом месте. А выразительность кода может оценить только программист не менее сильный чем ты сам, но это бывает так редко, да и обычно не до этого, так как есть сроки в часах, дедлайн и так далее ) |
|
10.02.2017, 14:21 | #19 |
Участник
|
|
|
10.02.2017, 15:28 | #20 |
Участник
|
Цитата:
Я, честно, стал опасаться кудесников, которые могут решить подобные задачи, но не знают основных паттернов в Dax - FormLetter'a там или ничего не слышали А еще лучше - по бизнесу задать вопросы. Тогда понятно, кто это - кодер (поставь задачу - я решу, если хорошо разжевать) или Программист (сначала пойму задачу, изучу настройки, часть так / часть из кода, пойму что от меня хотят, как это работает в другом модуле, попробую переубедить или поискать другой воркэраунд или запрограммировать малой кровью). Как можно заметить, второй - это Программист, которому лень быть консультантом. Т.е. мы получаем 2-в-1. Даже 3 в 1, т.к. отсутствует процесс коммуникации и тестирование легче. Подобные люди стоят хоть и подороже, но в разы эффективнее. |
|