Существует хорошо известный вопрос здесь , что просит короткие (наименее символов) генератор последовательности Фибоначчи.
Я хотел бы знать, может ли кто-то генерировать только первые N элементов последовательности Фибоначчи за очень короткое время. Я пытаюсь сделать это на python, но меня интересует любой короткий ответ, на любом языке. Функция F (N) генерирует первые N элементов последовательности, либо возвращает их как возврат функции, либо печатает их.
Интересно, что ответы на вопросы кода-гольфа начинаются с 1 1 2
, а не с 0 1 1 2
. Это соглашение в код-гольфе или программировании в целом? (Википедия говорит, что последовательность Фибоначчи начинается с нуля.)
Образец Python (первые 5 элементов):
def f(i,j,n):
if n>0:
print i;
f(j,i+j,n-1)
f(1,1,5)
F_0 = 0, F_1 = 1
или эквивалентноF_1 = 1, F_2 = 1
. Разница в том, хотите ли вы начать последовательность с индекса 0 (чаще встречается в программировании) или 1 (чаще встречается в математике).F_0 = 0, F_1 = 1
имеет определенное преимущество в простоте с матричным представлением[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]
.Ответы:
С
Не стал считать, но вот забавный пример:
Доказательство это работает.
Я очень горжусь этим: мне стало скучно, поэтому я переставил свой код (с несколькими небольшими дополнениями), чтобы он соответствовал каждой строке, представляющей значение в последовательности Фибоначчи.
Доказательство это работает.
источник
a++<=b
->a++-b
иreturn--n<3?1:f(n)+f(n-1)
. Кроме того, вы можете избежать,scanf
если вы требуете n быть вargc
.--n
того же выражения не имеет значения. Brilliant!4
там на самом деле должно быть3
. Как в настоящее время написано с<4
, полученная последовательность составляет 1, 1, 1, 2, 3, 5, 8 ... Это слишком много единиц.return n<3?n>0:f(--n)+f(--n);
Хаскелл (26)
Удивительно, но это всего на один символ длиннее, чем J-решение.
Я сбрил несколько персонажей:
take
в качестве бинарного оператора;scanl
вместо многословногоzipWith
.источник
s
это так элегантно, я не знаю, как кто-нибудь мог бы подумать о подобном решении! Что я не знал, так это то, что вы можете использоватьs
снова при определенииs
. (Я все еще новичок =)Вот однострочный Python. Он использует плавающую точку, поэтому могут быть некоторые,
n
для которых он более не точен.F(n)
возвращает строку, содержащую первыеn
числа Фибоначчи, разделенные пробелами.источник
GolfScript, 16 символов
Пример вывода:
источник
Perl, 50 символов
источник
Скала 71:
печать
источник
Perl,
2928 байтобъяснение
Это основано на классическом
$b += $a = $b-$a
повторении, которое работает следующим образом:$a
содержитF(n-2)
и$b
содержитF(n)
$a = $b-$a
$a
содержитF(n-1)
$b += $a
$b
содержитF(n+1)
Проблема здесь заключается в инициализации. Классический путь,
$b += $a = $b-$a || 1
но затем последовательность идет1 2 3 5 ...
Расширяя последовательность Фибоначчи влево:
Вы видите, что правильной отправной точкой является
$a = -1
и$b = 0
. Инициализация $ a может быть объединена с настройкой циклаНаконец, замените
$a
,$;
чтобы избавиться от места доfor
источник
Я могу дать вам двухстрочное решение Python. Это вернет их в виде списка.
Вы можете распечатать их, добавив еще одну карту, чтобы сделать их строками, а затем добавив соединение, но мне это просто не нужно.
К сожалению, я не знаю, как вставить рекурсивную лямбду
map
, поэтому я застрял в двух строках.источник
g(100)
? ;)f(n)
сn<=0
целыми числами возвращает иn>0
возвращает списки, так что ... может быть, это не идеально:f = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
0
в своем ответе. Изменениеf
возвратаn if n < 2
- это один из обходных путей. :)Python (78 символов)
Я использовал формулу Бине для вычисления чисел Фибоначчи -
Это не так мало, некоторые другие ответы здесь, но мальчик это быстро
источник
print"11235"
:)2**i
.**
имеют более высокий приоритет, чем*
Схема
Это оптимизировано с использованием хвостовой рекурсии:
источник
Haskell
Доказательство того, что это работает .
источник
J, 25 символов
Я понимаю, что решения J, вероятно, не то, что вы ищете, но вот одно из них. :-)
Применение:
Как это работает:
Начиная справа (потому что J программы читаются справа налево),
2-~ 6
~
Оператор меняет аргумент глагола , так это то же самое,6-2
Пока игнорируем раздел в скобках,
0 1(...)@[&0~ x
берём глагол в скобках и выполняем егоx
раз, используя список в0 1
качестве входных данных -~
снова меняются аргументы здесь, даваяx (...)@[&0 ] 0 1
, что означает, что я могу сохранить ввод в конце функции.В скобках вилка ,
],+/&(_2&{.)
которая состоит из трех глаголов -]
,,
и+/&(_2&{.)
.Вилка берет три глагола
a b c
и использует их следующим образом:(x a y) b (x c y)
гдеx
иy
являются аргументами вилки. Это,
центральный глагол в этой вилке и объединяет результатыx ] y
иx +/&(_2&{.) y
вместе.]
возвращает левый аргумент без изменений, поэтомуx ] y
оценивается какx
.+/&(_2&{.)
берет два последних элемента из данного списка(_2&{.)
- в данном случае0 1
- и затем складывает их вместе+/
(&
s просто действуют как клей).После того, как глагол сработал, результат возвращается для следующего запуска, генерируя последовательность.
источник
TI-Basic, 43 символа
Этот код может быть непосредственно вставлен в основную программу или преобразован в отдельную программу, на которую ссылается первая.
источник
APL (33)
Применение:
источник
Python (55)
источник
Powershell - 35 символов
Powershell принимает трубопроводный вход , так что я в убеждении , что
n |
вn | <mycode>
не должно быть против моего счета, но вместо этого лишь часть инициирования «функции» на языке.Первое решение предполагает, что мы начинаем с 0:
Второе решение предполагает, что мы можем начать с 1:
Пример вызова:
5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}
Урожайность:
Интересно отметить , что попытки избежать накладных расходов на
for()
петле в результате одной и той же количество символов:%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}
.источник
Питон, 43 символа
Вот три принципиально разных однострочника, которые не используют формулу Бине.
Я никогда не злоупотреблял
reduce
так сильно.источник
reduce
злоупотреблениепостоянный ток, 32 символа:
На самом деле это всегда будет отображать две первые 1, поэтому функция работает только так, как ожидается для N> = 2 .
C, 75 символов:
Не так круто, как принятый ответ, но короче и намного быстрее:
Дополнительно:CL, 64 символа:
Одна из моих наиболее часто используемых закладок в этом семестре имеет интересный пример, который короче, чем
многиедругие здесь, и это всего лишь прямой вызовloop
макроса - в основном только одно утверждение! Удалили все, что могли:Довольно коротко, красиво и читабельно! Для чтения ввода
n
(включая окружающие пробелы) можно заменить(read)
, добавив 3 символа.источник
main
четыре аргумента?ЛОЖЬ, 28 байтов
источник
1_
вместо0 1 -
Python 2, 38 байт
Улучшение ранее опубликованного решения:
Это использует
exec
и умножение строк, чтобы избежать циклов.Python 3, 46 байт
Не так эффективно в Python 3:
источник
C99, 58 знаков
Следующая функция заполняет массив целых чисел первыми
n
значениями из последовательности Фибоначчи, начиная с 0.Тестировать жгут, принимая
n
в качестве аргумента командной строки:источник
CoffeeScript, 48
65 в js:
источник
PHP, 87
Использует
array_sum
и рекурсивную функцию для генерации рядов.Например:
источник
F #, 123
источник
Скала, 65 символов
Это печатает, например, первые 9 чисел Фибоначчи. Для более удобной версии, берущей длину последовательности из ввода с консоли, требуется 70 символов:
Остерегайтесь использования диапазона, ограничивающего это значениями Int.
источник
Q 24
Первые n чисел Фибоначчи
источник
Луа, 85 байт
Я учу Lua, поэтому я хотел бы добавить этот язык в пул.
и все это заняло 85 символов с параметром в качестве аргумента командной строки. Еще один хороший момент - это то, что его легко читать.
источник
ЛОЖЬ, 20 символов
Ввод должен быть в стеке перед запуском этого.
источник
Пыть , 3 байта
Попробуйте онлайн!
источник
машинный код x86 - 379 байт
Версия с заголовками ELF, набравшими 484 байта:
Версия без заголовка (это та, которая будет оценена):
источник