|
09.02.2017, 21:06 | #1 |
Участник
|
Цитата:
Кеширование конечно хорошо, но бесполезно. Ибо ряд бесконечен и программа все равно упадет из-за переполнения. Или Вы предлагаете после достижения результата в N-1 знаков, где N = кол-во не влезающее в память, разбивать результат на части и обсчитывать их отдельно, после чего выводить потоком на экран? (Точнее на бумажку, так как предлагалось писать код на листе А4) А потом так же поступать и с отдельными частями результата ибо и они переполнятся. А это рекурсия. Цитата:
Единственный логичный выход, по моему, это сделать так же. Удалиться. ) Видится мне код из трех строчек включая декларативную часть с тремя десятками комментариев...
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) Последний раз редактировалось Silence; 09.02.2017 в 21:43. |
|
09.02.2017, 23:16 | #2 |
Участник
|
)))))
Цитата:
Спасибо за разъяснения. Свое мнение не изменил. |
|
09.02.2017, 23:35 | #3 |
Участник
|
Т.е. Вы считаете, что для бесконечного цикла нужно писать нечто вроде:
X++: while (true) Или Вы думаете, нужно было объяснить, что задача поставлена не верно? Сомневаюсь, что ждали именно этого. ЗЫ. Наверное это не то место для таких дискуссий
__________________
Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) |
|
10.02.2017, 00:50 | #4 |
Участник
|
Я знаю, что эта задача является классической.
Разбирается во всевозможных статьях. Начиная от школьных обучающих курсов до многотомника Кнута. Сходу можно привести 4-5 решений. Где-то видал статью с 15 способами. Один из них, где время расчета меньше O(n). рекурсию привести конечно можно. но оговорив область применимости, влияние повторных расчетов на производительность и прочие недостатки. while(true)... му-ха-ха-ха!!!! хороший панк-юмор да, это один из способов решения. в памяти хранятся только два последних значения, повторных вычислений нет, время выполнения линейное. момент, который не оговорен - целочисленные значения. для такого случая было бы хорошо оговорить область применимости ))) в обычных системах, скорее всего, выполнение прервется по переполнению раньше, чем пользователь нажмет CTRL + BREAK/ в аксапте приведенный алгоритм, скорее всего, будет просто выдавать неправильные (отрицательные) значения начиная с некоторого числа, причем достаточно близкого к началу последовательности. если программист не оговорил хотя бы в комментарии область применимости... и не предупредил, что она будет настолько маленькой... с точки зрения аксапты, я бы обратил внимание, что автор использует int2str вместо strfmt. Это была бы тема для дополнительных вопросов. свое мнение не изменил - мне бы тоже не понравилось. Последний раз редактировалось mazzy; 10.02.2017 в 01:05. |
|
14.02.2017, 06:12 | #5 |
NavAx
|
Сложно сказать чего они ждали. Это могла быть тупая задачка из букваря, а мог быть завуалированный вопрос:"какие ассоциации вызывает у вас слово рекурсия?"
__________________
Isn't it nice when things just work? |
|
10.02.2017, 12:06 | #6 |
Участник
|
Так это задача программиста выбрать подходящий способ решения. Рассмотреть несколько возможных вариантов решений, оценить их плюсы и минусы и задать уточняющие вопросы. Постановщик может не знать об ограничениях, или умышленно умолчать, чтобы посмотреть, как человек будет выкручиваться при недостатке информации и нечетких требованиях.
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
11.02.2017, 18:57 | #7 |
Участник
|
"Большие числа" - это как раз то, о чем говорил Silence в самом начале
Цитата:
Сообщение от Silence
Кеширование конечно хорошо, но бесполезно. Ибо ряд бесконечен и программа все равно упадет из-за переполнения. Или Вы предлагаете после достижения результата в N-1 знаков, где N = кол-во не влезающее в память, разбивать результат на части и обсчитывать их отдельно, после чего выводить потоком на экран? (Точнее на бумажку, так как предлагалось писать код на листе А4) А потом так же поступать и с отдельными частями результата ибо и они переполнятся. А это рекурсия.
Но я бы очень внимательно смотрел на повторные вычисления и на переполнение. чтобы понять, что кандидат понимает проблему. "на листочке" вполне хватило бы комментария // функция применима для 30-60 первых чисел Наивный рекурсивный код {... result = fib(n-1) + fib(n-2)} делает слишком много повторных вычислений. для "листочка" хватило бы простого кэширования уже полученных чисел. или изящного решения, о котором я конечно же забыл, и которое показал Андре в этой ветке - передается больше параметров в стек, но полностью и ультимативно решается вопрос повторных вычислений в рекурсии. или решения через итерацию и хранение в памяти только двух последних чисел, как показал Ace of Database. Последний раз редактировалось mazzy; 11.02.2017 в 19:14. |
|