]]> ]]>

Числа Фибоначчи

Числа Фибоначчи — числовая последовательность, первые два элемента которой равны 1, а каждый последующий равен сумме двух предыдущих.

Вывод программы должен выглядеть следующим образом: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, …

Отметим, что данный пример может быть реализован несколькими способами:

  • непосредственно через рекурсивное определение: наименее эффективный способ, позволяющий в то же время продемонстрировать использование рекурсивных функций.
  • с сохранением вычисленных чисел в массиве: более эффективный способ, позволяющий продемонстрировать работу с массивами.
  • через формулу Бине: наиболее эффективный способ, позволяющий продемонстрировать работу с математическими функциями.

Пример для версий Free Pascal 2.2.0, Free Pascal 2.2.4, gpc 20070904, PascalABC.NET 1.8, Turbo Pascal 1.0, Turbo Pascal 2.0, Turbo Pascal 3.0, Turbo Pascal 4.0, Turbo Pascal 5.0, Turbo Pascal 5.5, Turbo Pascal 6.0, Turbo Pascal 7.0

Этот пример использует рекурсивное определение чисел Фибоначчи.

program fibonacci;

function fib(n:integer): integer;
begin
    if (n <= 2) then
        fib := 1
    else
        fib := fib(n-1) + fib(n-2);
end;

var
    i:integer;

begin
    for i := 1 to 16 do
        write(fib(i), ', ');
    writeln('...');
end.

Пример для версий Euphoria 3.1.1

function fib(integer n)
    sequence f
    if n = 1 then
        return {1}
    elsif n = 2 then
        return {1,1}
    else
        f = fib(n-1)
        f = append(f, f[$-1] + f[$])
        return f
    end if
end function

print(1,fib(16))

Пример для версий clisp 2.47, Corman Common Lisp 3.0, gcl 2.6.6, SBCL 1.0.1, SBCL 1.0.29

Используется рекурсивное определение чисел Фибоначчи. Часть finally макроса loop выполняется после конца цикла.

(defun fibonacci (n)
    (if (< n 3)
        1
        (+ (fibonacci (- n 1)) (fibonacci (- n 2))) ))

(loop for i from 1 to 16
    do (format t "~D, " (fibonacci i))
    finally (format t "...~%"))

Пример для версий Borland C++ Builder 6, g++ 3.4.5, Microsoft Visual C++ 6, Microsoft Visual C++ 9 (2008)

#include <iostream>

int fibonacci(int n)
{
    return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2));
}

int main(void)
{
    for (int n=1; n<=16; n++)
        std::cout << fibonacci(n) << ", ";
    std::cout << "..." << std::endl;
    return 0;
}

Пример для версий gcj 3.4.5, Groovy 1.7, Sun Java 6

Используется рекурсивное определение чисел Фибоначчи.

public class Fibonacci {
    static int fibonacci(int n)
    {
        return (n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2));
    }
    public static void main(String[] args)
    {
        for (int n=1; n<=16; n++)
            System.out.print(fibonacci(n)+", ");
        System.out.println("...");
    }
}

Пример для версий Microsoft Visual Basic 6

Используется рекурсивное определение чисел Фибоначчи.

Option Explicit

    Declare Function AllocConsole Lib "kernel32" () As Long
    Declare Function FreeConsole Lib "kernel32" () As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
           (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
           nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
           lpReserved As Any) As Long
    Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long

Public Function Fibonacci(ByVal n As Integer) As Integer
    If (n <= 2) Then
        Fibonacci = 1
    Else
        Fibonacci = Fibonacci(n - 1) + Fibonacci(n - 2)
    End If
End Function

Private Sub Main()
    'create a console instance
    AllocConsole
    'get handle of console output
    Dim hOut As Long
    hOut = GetStdHandle(-11&)
    'output string to console output
    Dim s As String
    Dim i As Integer
    For i = 1 To 16 Step 1
        s = Fibonacci(i) & ", "
        WriteConsole hOut, ByVal s, Len(s), vbNull, vbNull
    Next i
    s = "..." & vbCrLf
    WriteConsole hOut, ByVal s, Len(s), vbNull, vbNull
    'make a pause to look at the output
    Sleep 2000
    'close the handle and destroy the console
    CloseHandle hOut
    FreeConsole
End Sub

Пример для версий QBasic 1.1, QuickBasic 4.50

Используется рекурсивное определение чисел Фибоначчи. Каждый вызов команды PRINT выводит аргументы в отдельную строку и добавляет пробел перед и после выводимого числа. В результате вывод программы имеет следующий вид:

1 ,
1 ,
2 ,
3 ,
5 ,
8 ,
13 ,
21 ,
34 ,
55 ,
89 ,
144 ,
233 ,
377 ,
610 ,
987 ,

DECLARE FUNCTION fibonacci (n)

FOR i = 1 TO 16:
    PRINT fibonacci(i); ", "
NEXT i
PRINT "..."

FUNCTION fibonacci (n)
    IF (n <= 2) THEN
        fibonacci = 1
    ELSE
        fibonacci = fibonacci(n - 1) + fibonacci(n - 2)
    END IF
END FUNCTION

Пример для версий QBasic 1.1, QuickBasic 4.50

Уже вычисленные числа хранятся в массиве F и извлекаются оттуда для вычисления следующих. Для получения вывода программы в нужном формате числа в массиве конкатенируются в одну строку с нужными разделителями. Функция STR$ преобразует число в строку.

DIM F(16)
F(1) = 1
F(2) = 1
FOR i = 3 TO 16:
    F(i) = F(i - 1) + F(i - 2)
NEXT i
DIM S AS STRING
S = ""
FOR i = 1 TO 16:
    S = S + STR$(F(i)) + ", "
NEXT i
S = S + "..."
PRINT S

Пример для версий QBasic 1.1, QuickBasic 4.50

Числа Фибоначчи вычисляются через формулу Бине. За счет погрешностей вычисления с плавающей точкой полученные числа могут незначительно отличаться от действительных; для устранения этого эффекта используется функция INT, отбрасывающая дробную часть числа.

DECLARE FUNCTION FIBONACCI (n)

DIM S AS STRING
S = ""
FOR i = 1 TO 16:
    S = S + STR$(INT(FIBONACCI(i) + .1)) + ","
NEXT i
S = S + "..."
PRINT S

FUNCTION FIBONACCI (n)
    p1 = ((1 + SQR(5)) * .5) ^ n
    p2 = ((1 - SQR(5)) * .5) ^ n
    FIBONACCI = (p1 - p2) / SQR(5)
END FUNCTION

Пример для версий Oracle 10g SQL, Oracle 11g SQL

SQL не поддерживает циклы или рекурсии, кроме того, конкатенация полей из разных строк таблицы или запроса не является стандартной агрегатной функцией. Данный пример использует:

  • формулу Бине и математические функции ROUND, POWER и SQRT для вычисления n-ого числа Фибоначчи;
  • псевдостолбец level для создания псевдотаблицы t1, содержащей числа от 1 до 16;
  • встроенную функцию SYS_CONNECT_BY_PATH для упорядоченной конкатенации полученных чисел.
 SELECT REPLACE(MAX(SYS_CONNECT_BY_PATH(fib||', ', '/')),'/','')||'...' fiblist 
   FROM ( 
    SELECT n, fib, ROW_NUMBER() 
      OVER (ORDER BY n) r 
      FROM (select n, round((power((1+sqrt(5))*0.5, n)-power((1-sqrt(5))*0.5, n))/sqrt(5)) fib 
              from (select level n
                      from dual
                   connect by level <= 16) t1) t2
) 
  START WITH r=1 
CONNECT BY PRIOR r = r-1; 

Пример для версий EsCo 0.511 (Brainfuck), Müller's Brainfuck 2.0, weave.rb

В примере используется итеративное определение чисел Фибоначчи: два последних числа хранятся в ячейках-переменных c4 и c5 (в начале c4=0, c5=1), число c5 посимвольно выводится на печать (это действие занимает большую часть кода), затем вычисляется следующее число (c6 = c5+c4), и числовая пследовательность сдвигается на одно число вперед (c4 = c5, c5 = c6). Низкоуровневое описание приведено в комментариях к коду, запись “cXvY” означает, что после выволнения команд в строке указатель данных находится в ячейке X, и значение в этой ячейке равно Y.

Классический интерпретатор Brainfuck использует переменные типа byte для хранения значений в ячейках памяти, и 14-16 числа Фибоначчи вызовут ошибку переполнения. Написание длинной арифметики на Brainfuck — задача достаточно трудоемкая, поэтому в примере предполагается, что в ячейках памяти могут храниться числа типа integer.

++++++++++++++++++++++++++++++++++++++++++++		c1v44 : ASCII code of comma
>++++++++++++++++++++++++++++++++			c2v32 : ASCII code of space
>++++++++++++++++					c3v11 : quantity of numbers to be calculated
>							c4v0  : zeroth Fibonacci number (will not be printed)
>+							c5v1  : first Fibonacci number
<<							c3    : loop counter
[							block : loop to print (i)th number and calculate next one
>>							c5    : the number to be printed

							block : divide c5 by 10 (preserve c5)
>							c6v0  : service zero
>++++++++++						c7v10 : divisor
<<							c5    : back to dividend
[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]			c5v0  : divmod algo; results in 0 n d_n%d n%d n/d
>[<+>-]							c5    : move dividend back to c5 and clear c6
>[-]							c7v0  : clear c7

>>							block : c9 can have two digits; divide it by ten again
>++++++++++						c10v10: divisor
<							c9    : back to dividend
[->-[>+>>]>[+[-<+>]>+>>]<<<<<]				c9v0  : another divmod algo; results in 0 d_n%d n%d n/d
>[-]							c10v0 : clear c10
>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]c12v0 : print nonzero n/d (first digit) and clear c12
<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c11v0 : print nonzero n%d (second digit) and clear c11

<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-]	c8v0  : print any n%d (last digit) and clear c8
<<<<<<<.>.                                              c1c2  : print comma and space
							block : actually calculate next Fibonacci in c6
>>[>>+<<-]						c4v0  : move c4 to c6 (don't need to preserve it)
>[>+<<+>-]						c5v0  : move c5 to c6 and c4 (need to preserve it)
>[<+>-]							c6v0  : move c6 with sum to c5
<<<-							c3    : decrement loop counter
]
<<++...							c1    : output three dots

Пример для версий Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

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

with fibonacci(a, b) as
(
 select 1, 1
  union all
 select b, a+b from fibonacci where b < 1000
)
SELECT cast(a as varchar)+', ' AS [text()]
  FROM fibonacci
   FOR XML PATH ('')

Пример для версий iconc 9.4

Используется рекурсивное вычисление чисел Фибоначчи с мемоизацией промежуточных результатов

global fib_memo

procedure fib (n)
   if n >= 0 then
      return ((/fib_memo [n] := fib (n - 2) + fib (n - 1)) | fib_memo [n])
end

procedure main ()
   local i
   fib_memo := table ()
   fib_memo [0] := 0; fib_memo [1] := 1
   every i := 1 to 16 do {
      writes (fib (i) || ", ")
   }
   write("...")
end

Пример для версий Interactive FP

Этот пример работает так же, как пример факториала, но без добавления функций для читабельности.

{ seq ( = @ [id, %1] -> %<1> ; concat @ [ seq @ - @ [id, %1] , [id] ] ) }
{ fibonacci ( < @ [id, %3] -> %1 ; + @ [ fibonacci @ - @ [id, %1], fibonacci @ - @ [id, %2] ] ) }
&fibonacci @ seq:16

Пример для версий clisp 2.47, Corman Common Lisp 3.0, gcl 2.6.6

Этот пример использует итеративное определение чисел Фибоначчи без запоминания, выраженное через рекурсивный вызов функции fib-iter.

(defun fibonacci (n)
    (defun fib-iter (a b count)
        (if (zerop count)
            b
            (fib-iter (+ a b) a (- count 1))
        )
    )
    (fib-iter 1 0 n)
)

(loop for i from 1 to 16
    do (format t "~D, " (fibonacci i))
    finally (format t "...~%")
)

Пример для версий Visual Prolog 7.2

В этом примере определяются два новых предиката — бинарный fibonacci(N,F) для вычисления N-ого числа Фибоначчи и loop(N) для его вывода на печать. Единожды вычисленные числа не сохраняются для позднейшего использования, поэтому эта реализация неэффективна.

Следует отметить отличие реализаций предикатов от примера для факториала: формулы, описывающие начальные условия, задаются для произвольного значения переменной, но вычисляются до конца только в том случае, если первое правило (N<3 или N=1, соответственно) оценивается как истинное. Кроме того, каждый предикат записан как одна формула, использующая конъюнкцию и дизъюнкцию, а не как набор отдельных формул, использующих только конъюнкцию.

% main.cl
class main
    open core

predicates
    classInfo : core::classInfo.
    fibonacci : (integer N, integer F) procedure (i,o).
    loop : (integer N) procedure (i).
predicates
    run : core::runnable.

end class main

% main.pro
implement main
    open core

constants
    className = "main".
    classVersion = "".

clauses
    classInfo(className, classVersion).
    fibonacci(N,F) :- 
        N < 3, !, F = 1;
        fibonacci(N-1,F1), fibonacci(N-2,F2), F = F1 + F2.
    loop(N) :-
        ( N = 1, !, fibonacci(1,F);
          loop(N-1), fibonacci(N,F) ),
        stdio::write(F, ", ").        
clauses
    run():-
        console::init(),
        loop(16),
        stdio::write("..."),
        programControl::sleep(1000),
        succeed().
end implement main

goal
    mainExe::run(main::run).

Пример для версий Oracle 10g SQL, Oracle 11g SQL

Этот пример демонстрирует использование оператора model, доступного начиная с версии Oracle 10g и позволяющего обработку строк запроса как элементов массива. Каждая строка содержит два поля — само число Фибоначчи и конкатенация всех чисел, меньше или равных ему. Итеративная конкатенация чисел в том же запросе, в котором они генерируются, выполняется проще и быстрее, чем агрегация как отдельное действие.

select max(s) || ', ...'
  from
(select s
   from dual
   model 
     return all rows
     dimension by ( 0 d ) 
     measures ( cast(' ' as varchar2(200)) s, 0 f)
     rules iterate (16)
     (  f[iteration_number] = decode(iteration_number, 0, 1, 1, 1, f[iteration_number-1] + f[iteration_number-2]), 
        s[iteration_number] = decode(iteration_number, 0, to_char(f[iteration_number]), s[iteration_number-1] || ', ' || to_char(f[iteration_number]))
     )
);

Пример для версий MySQL 5

Замените TABLE на любую таблицу, к которой есть доступ, например, mysql.help_topic.

select concat(group_concat(f separator ', '), ', ...')
from (select @f := @i + @j as f, @i := @j, @j := @f
        from TABLE, (select @i := 1, @j := 0) sel1
       limit 16) t

Пример для версий ARIBAS 1.53

Этот пример использует рекурсивное определение чисел Фибоначчи. В ARIBAS по умолчанию используется тип данных integer. group(0) при выводе служит для отмены использования знака подчеркивания для разделения групп цифр.

function fib(n);
begin
    if (n < 3) then
        return(1);
    end;
    return(fib(n-1)+fib(n-2));
end;

function fib1_16();
var n;
begin
    for n := 1 to 16 do
        write(fib(n): group(0), ", ");
    end;
    writeln("...");
end;

fib1_16().

Пример для версий VB.NET 9 (2008), vbnc 2.4.2

Используется рекурсивное определение чисел Фибоначчи.

Module Module1
    Function Fibonacci(ByVal n As Integer) As Long
        If n < 3 Then
            Return 1
        Else
            Return Fibonacci(n - 1) + Fibonacci(n - 2)
        End If
    End Function

    Sub Main()
        For i As Integer = 1 To 16
            Console.Write(Fibonacci(i) & ", ")
        Next
        Console.WriteLine("...")
    End Sub
End Module

Пример для версий PHP 5.2.4, PHP 5.3.2

Используется рекурсивное определение чисел Фибоначчи.

<?php

function fibonacci($n)
{
    if ($n < 3) {
        return 1; 
    }
    else {
        return fibonacci($n-1) + fibonacci($n-2);
    }
}

for ($n = 1; $n <= 16; $n++) {
    echo(fibonacci($n) . ", ");
}
echo("...\n")
?>

Пример для версий Oracle 10g SQL, Oracle 11g SQL

Этот пример использует итеративное определение чисел Фибоначчи. Уже вычисленные числа хранятся в структуре данных varray — аналоге массива.

declare
    type vector is varray(16) of number;
    fib  vector := vector();
    i    number;
    s    varchar2(100);       
begin
    fib.extend(16);
    fib(1) := 1;
    fib(2) := 1;
    s := fib(1) || ', ' || fib(2) || ', ';
    for i in 3..16 loop
        fib(i) := fib(i-1) + fib(i-2);
        s := s || fib(i) || ', '; 
    end loop;
    dbms_output.put_line(s || '...');
end;

Пример для версий g95 0.93, gfortran 4.5.0, Intel Visual Fortran 11.1

Используется итеративное определение чисел Фибоначчи. Самое сложное в этом примере — вывод вычисленных значений в нужном формате, в одну строку и без лишних пробелов. Спецификация формата (I3, A, $) означает, что вначале выводится целое число в десятичном формате, шириной ровно три символа, затем выводится строка, и наконец, $ подавляет перевод строки, используемый командой print по умолчанию, так что все выводится в одну строку. Отметим, что в диалекте F спецификатор формата $ не является стандартным; программа работает, но при компиляции выводит предупреждение об этом.

program Fibonacci

  integer :: f1,f2,f3,i
  i = 1
  f1 = 0
  f2 = 1
  do
    f3 = f2 + f1
    f1 = f2
    f2 = f3
    i = i + 1
    if (f1 < 10) then
      print "(I1, A, $)", f1, ", "
    elseif (f1 < 100) then
      print "(I2, A, $)", f1, ", "
    else
      print "(I3, A, $)", f1, ", "
    end if
    if (i == 17) then
      exit
    end if
  end do
  print *, "..."

end program Fibonacci

Пример для версий Poplog 15.5 (Prolog)

Простая рекурсивная реализация слишком неэффективна с точки зрения памяти, чтобы успешно выполняться в Poplog, поэтому этот пример демонстрирует более сложную технику — рекурсию с запоминанием. Дополнительный предикат memo(Goal) определяется так, что в первый раз, когда оценивается Goal, результат оценки добавляется в базу фактов, и при следующем запросе не переоценивается, а используется как известный факт.

После этого предикат fib(N,F) определяется рекурсивно, но каждый вызов fib “обернут” в предикат memo, поэтому для каждого значения N fib(N,F) оценивается только один раз. При таком подходе печать вычисленных чисел может производиться сразу после их вычисления, без дополнительного цикла.

% fibonacci.pl
:- dynamic(stored/1).

memo(Goal) :-
    stored(Goal) -> true;
    Goal, assertz(stored(Goal)).

fib(1,1) :- !, write('1, ').
fib(2,1) :- !, write('1, ').
fib(N,F) :-
    N1 is N-1, memo(fib(N1,F1)), 
    N2 is N-2, memo(fib(N2,F2)), 
    F is F1 + F2,
    write(F), write(', ').

% interactive
[-fibonacci].
fib(16,X), write('...'), nl.

Пример для версий Poplog 15.5 (POP-11)

Используется рекурсивное определение чисел Фибоначчи. Пример работает так же, как факториал, но loop возвращает строку, содержащую конкатенацию всех чисел Фибоначчи до n-ого включительно.

define fibonacci(n);
    if n < 3 
        then 1
        else fibonacci(n - 1) + fibonacci(n - 2)
    endif
enddefine;

define loop(n);
    if n>1 
        then loop(n-1) >< ', ' >< fibonacci(n)
        else fibonacci(n)
    endif;
enddefine;

loop(16) >< ', ...' =>

Пример для версий Lua 5.0

Используется рекурсивное определение чисел Фибоначчи.

function fibonacci(n)
    if n<3 then
        return 1
    else
        return fibonacci(n-1) + fibonacci(n-2)
    end
end

for n = 1, 16 do
    io.write(fibonacci(n), ", ")
end
io.write("...\n")

Пример для версий Lua 5.0

Вычисленные числа хранятся в ассоциативном массиве fib и извлекаются из него для вычисления следующих. По умолчанию ассоциативные массивы в Lua используют целочисленные ключи, начинающиеся с 1, поэтому команда fib = {1, 1} создает массив с индексами элементов 1 и 2.

fib = {1, 1}
for n = 3, 16 do
    fib[n] = fib[n-1] + fib[n-2]
end
for n = 1, 16 do
    io.write(fib[n], ", ")
end
io.write("...\n")

Пример для версий SpiderMonkey (Firefox 3.5)

Используется рекурсивное определение чисел Фибоначчи. Пример предназначен для запуска из веб-браузера.

function fibonacci(n)
{   if (n<3)
        return 1;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}
var i;
document.clear();
for (i = 1; i <= 16; i++)
    document.write(fibonacci(i) + ", ");
document.write("...<br />");

Пример для версий GHC 6.10.4

Этот пример использует одну из основных особенностей языка Haskell — возможность ленивых вычислений и использования бесконечных списков. Бесконечный список чисел Фибоначчи fibs определяется при помощи фунции zipWith, которая применяет первый аргумент (функцию двух переменных, в данном случае +) к парам соответствующих элементов второго и третьего аргументов (списков). tail fibs возвращает хвост списка fibs (т.е. все элементы, кроме первого). Таким образом первый элемент списка, возвращаемого zipWith, является суммой первого и второго элементов списка fibs и становится третьим его элементом.

module Main where

import Text.Printf

fibs :: [Int]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

line n = printf "%d, " $ fibs !! n

main = do
    sequence_ $ map line [1..16]
    putStrLn "..."

Пример для версий GHC 6.10.4

Этот пример использует рекурсивное определение чисел Фибоначчи через пары соседних чисел в последовательности. На печать выводятся только первые элементы пар.

module Main where

import Text.Printf

fibNextPair :: (Int, Int) -> (Int, Int)
fibNextPair (x, y) = (y, x+y)

fibPair :: Int -> (Int, Int)
fibPair n 
    | n == 1 = (1, 1)
    | otherwise = fibNextPair (fibPair (n-1))

line n = printf "%d, " $ (fst.fibPair) n

main = do
    sequence_ $ map line [1..16]
    putStrLn "..."

Пример для версий Furry Paws

one = eq.[id, ~1]
dec = sub.[id, ~1]
seq = one -> [~1] ; cat.[seq.dec, [id]]
fibonacci = lt.[id, ~3] -> ~1 ; add.[fibonacci.sub.[id, ~1], fibonacci.sub.[id, ~2]]

main = show.(return @fibonacci.(seq.~16))

Пример для версий gnat 3.4.5

В этом примере используется рекурсивное определение чисел Фибоначчи.

with Ada.Text_IO, Ada.Integer_Text_IO;

procedure Fibonacci is
begin
   declare 
      function Fib (N: Integer) return Integer is
      begin
         if N<3 then
            return 1;
         else 
            return Fib(N-1) + Fib(N-2);
         end if;
      end Fib;
   i: Integer := 1;
   begin
      loop
         Ada.Integer_Text_IO.Put (Item => Fib(i), Width => 1);
         Ada.Text_IO.Put (", ");
         i := i + 1;
         exit when i=17;
      end loop;
      Ada.Text_IO.Put ("...");
   end;
end Fibonacci;

Пример для версий UCBLogo 6.0

Используется рекурсивное определение чисел Фибоначчи. В примере определяются две функции — fibonacci для вычисления значения N-ого числа Фибоначчи и print_fibonacci, которая накапливает числа в строке и выводит их на печать.

to fibonacci :N
   ifelse :N < 3 [output 1] [output sum fibonacci :N - 1 fibonacci :N - 2]
end

to print_fibonacci :i :N
   make "str fibonacci :i
   make "i sum :i 1
   make "comma ",
   repeat :N - :i + 1 [make "str (word :str :comma fibonacci :i)
                      make "i sum :i 1]
   make "str word str ",...
   print str
end

print_fibonacci 1 16

Пример для версий Scala 2.7.7-final

Используется рекурсивное определение чисел Фибоначчи.

object Fibonacci {
    def fibonacci(n: Int): Int = 
        if (n < 3) 1 
              else fibonacci(n - 1) + fibonacci(n - 2)
    def main(args: Array[String]) {
        for {i <- List.range(1, 17)} 
            yield { print(fibonacci(i) + ", ") }
        println("...")
    }
}

Пример для версий Scala 2.7.7-final

Этот пример демонстрирует возможности использования ленивых вычислений и бесконечных списков в Scala. Бесконечный список чисел Фибоначчи fibs определяется при помощи фунций .zip и .tail по аналогии с примером на Haskell. Пример предназначен для интерактивной интерпретации.

lazy val fib: Stream[Int] = Stream.cons(1, Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))
fib.take(16).print

Пример для версий gawk 3.1.6, Jawk 1.02, mawk 1.3.3

Используется итеративное определение чисел Фибоначчи. fib — ассоциативный массив, pr — строка.

BEGIN {
    fib[1] = 1
    fib[2] = 1
    for (i=3; i<17; i++)
        fib[i] = fib[i-1]+fib[i-2]
    pr = ""
    for (i=1; i<17; i++)
        pr = pr fib[i] ", "
    print pr "..." 
}

Пример для версий S-lang 2.2.2

В примере используется итеративное определение чисел Фибоначчи. Переменная f явно определена как массив 16 целых чисел. Элементы 0 и 1 массива устанавливаются в 1: для этого операцией [0:1] создается список индексов, к которым следует применить операцию. Встроенная функция string преобразует свой аргумент в его строковое представление.

f = Integer_Type [16];
f[[0:1]] = 1;
for (i=2; i<16; i++)
    f[i] = f[i-1] + f[i-2];
s = "...";
for (i=15; i>=0; i--)
    s = string(f[i]) + ", " + s;
message (s);

Пример для версий Hanoi Love

В примере используется итеративное определение чисел Фибоначчи.

Стек A большую часть времени пуст и используется для получения константы 1; иногда используется для временного хранения значений (по тому же принципу, что и в оригинальной задаче о Ханойских башнях). Стек B содержит символы, выводимые на печать (запятую и пробел) и два последних числа Фибоначчи из вычисленных программой. Стек C содержит значение 1 для каждого числа Фибоначчи, которое нужно напечатать (в данном случае шесть единиц для печати 6 чисел).

На каждой итерации одно число извлекается из стека C. Если оно положительно (т.е. нужно вычислить и напечатать еще одно число Фибоначчи), верхнее число f2 из стека B извлекается, преобразуется в ASCII-код соответствующей цифры и выводится на печать вместе с запятой и пробелом. После этого следующее число f1 извлекается из стека B и прибавляется к числу f2. Наконец, числа f2 и f1+f2 возвращаются в стек B. Низкоуровневое описание примера приводится в комментариях.

Интерпретатор Hanoi Love использует переменные типа byte для хранения значений в регистре и стеках, поэтому принципиально возможно вычислить только первые 13 чисел Фибоначчи. В действительности пример выводит только первые 6 чисел Фибоначчи, чтобы не усложнять программу печатью двух- и трехзначных чисел (которая выполняется по тому же принципу, что и в Brainfuck, но сложнее).

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .'                   B (space) regr = ASCII for space
...;;;;;;;;;;;;.'                                     B (space comma) reg = ASCII for comma
...,                                                  A (empty) reg = 1
..''''''                                              C (6 ones for 6 numbers to print) reg = 1
..`.'...;.'                                           B (space comma 0 1) reg = 1
.,                                                    C (pop number to reg) reg = 1
.'...                                                 D (remembered this place)
:                                                     if this number is positive print top number in B and move to next Fibonacci number
...,                                                  B (space comma f1) reg = f2
.'                                                    C (f2) reg = f2
..;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; "' A (empty) reg = f2 in ASCII (printed)
.,                                                    B (space comma) reg = f1
.'                                                    C (f2 f1) reg = f2
..., "'                                               B (space) reg = comma (printed)
.'                                                    C (f2 f1 comma) reg = comma
..., "' '                                             B (space) reg = space (printed)
.,...'                                                B (space comma) reg = comma
.,                                                    C (f2) reg = f1
..'                                                   A (f1) reg = f1
..,                                                   C (empty) reg = f2
...'                                                  B (space comma f2) reg = f2
...;                                                  A (empty) reg = f1+f2
.'                                                    B (space comma f2 f1+f2)
.,                                                    C (pop number to reg)
.,                                                    D (get previous command location)
!
...,,,...;; "' "' "'                                  pop everything from B and convert comma to point (printed three times)

Пример для версий J602

В этом примере используется формула Бине.

Запись g =: -: >: %:5 эквивалентна g =: 0.5 * (1 + 5 ^ 0.5) и присваивает имя g значению золотого сечения. Для этого используются следующие функции: %: извлекает квадратный корень из числа, >: увеличивает число на единицу, -: делит число на два. Если в формуле нет скобок, то действия выполняются справа налево.

Запись fibb=: (%:5) %~ g&^ — (1-g)&^ эквивалентна fibb =: (0.2 ^ 0.5) * (g &^ — (1-g) &^); таким образом определяется формула для n-ого числа Фибоначчи при заданном n. Функция %~ выполняет операцию деления, но делимое и делитель имеют порядок, обратный традиционному.

i.16 генерирует числа от 0 до 15, включительно.

load 'printf'

g=: -: >: %:5
fibb=: (%:5) %~ g&^ - (1-g)&^
fstr=: '...' ,~ ,~^:4 '%d, '
fstr printf fibb 1+i.16

Пример для версий J602

В этом примере используется рекурсивное определение чисел Фибоначчи. Оператор @. — селектор, выбирающий 1, если аргумент функции меньше или равен 2, и рекурсивное определение в противном случае.

load 'printf'

fibr=: 1:`(-&2 + &fibr -&1) @.(2&<)"0
fstr=: '...' ,~ ,~^:4 '%d, '
fstr printf fibr 1+i.16

Пример для версий Mathics 0.4, Wolfram Mathematica 7.0.1.0, Wolfram Mathematica 8.0.4

Print обязательно завершает вывод переносом строки, поэтому для того, чтобы вывести все числа Фибоначчи в одной строке, их нужно накопить в переменной msg и вывести ее. <> — оператор конкатенации; он работает только с явными строками, поэтому результат вызова Fibonacci нужно явно перевести в строку функцией ToString.

msg = "";
Do[msg = msg <> ToString[Fibonacci[i]] <> ", " , {i, 16} ];
Print[msg, "..."];

Пример для версий Mercury 10.04

Вычисление и вывод на экран десятого числа последовательности Фибоначчи.

 :- module fib.
 :- interface.
 :- import_module io.
 :- pred main(io::di, io::uo) is det.
 
 :- implementation.
 :- import_module int.

 :-func fib(int) = int.
 fib(N) = (if N =< 2 then 1 else fib(N - 1) + fib(N - 2)).

 main(!IO) :-
        io.write_string("fib(10) = ", !IO),
        io.write_int(fib(10), !IO),
        io.nl(!IO).
        % Could instead use io.format("fib(10) = %d\n", [i(fib(10))], !IO).

Пример для версий Whitespacers (Ruby)

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

push_1  { 	}
push_-16  {		    }
store		 push_2  { 	 }
push_44  { 	 		  }
store		 push_3  { 		}
push_32  { 	     }
store		 push_4  { 	  }
push_0  {	 }
store		 push_5  { 	 	}
push_1  { 	}
store		 label
  { }
start_loop_push_5  { 	 	}
push_4  { 	  }
retrieve			push_4  { 	  }
duplicate 
 push_5  { 	 	}
retrieve			duplicate 
 print_as_number	
 	push_2  { 	 }
retrieve			print_as_char	
  push_3  { 		}
retrieve			print_as_char	
  store		 retrieve			add	   store		 push_1  { 	}
duplicate 
 duplicate 
 duplicate 
 retrieve			add	   store		 retrieve			jump_if_negative
		{ }
push_10  { 	 	 }
push_46  { 	 			 }
duplicate 
 duplicate 
 print_as_char	
  print_as_char	
  print_as_char	
  print_as_char	
  quit


end

Пример для версий erl 5.7.3

Используется итеративное определение чисел Фибоначчи, выраженное в форме хвостовой рекурсии.

-module(prog).
 
-export([main/0]).
 
fib(1,_,Res) -> 
    io:format("~B, ",[Res]);
fib(N,Prev,Res) when N > 1 -> 
    io:format("~B, ",[Res]),
    fib(N-1, Res, Res+Prev).
 
main() -> 
    fib(16,0,1),
    io:format("...~n").

Пример для версий erl 5.7.3

Используется формула Бине. Числа с плавающей точкой обязаны выводиться с как минимум одним знаком после запятой, поэтому результат работы выглядит так:

1.0, 1.0, 2.0, 3.0, 5.0, 8.0, 13.0, 21.0, 34.0, 55.0, 89.0, 144.0, 233.0, 377.0, 610.0, 987.0, ...

-module(prog).
 
-export([main/0]).
 
fib(0) -> ok;
fib(N) -> 
    fib(N-1),
    SQ5 = math:sqrt(5),
    T1 = math:pow(0.5*(1 + SQ5),N),
    T2 = math:pow(0.5*(1 - SQ5),N),
    io:format("~.1f, ", [(T1-T2)/SQ5]).
    
main() ->
    fib(16),
    io:format("...~n").

Пример для версий GDC 0.24

Используется рекурсивное определение чисел Фибоначчи.

module fibonacci;

import std.stdio;

ulong recursive(ulong x)
{
	return x <= 2 ? 1 : recursive( x - 2 ) + recursive( x - 1 );
}

int main()
{
	for (uint i = 1; i < 17; i++)
	{
		writef("%s, ", recursive(i));
	}
	writefln("%s", "...");
	
	return 0;
}

Пример для версий GDC 0.24

Используется итеративное определение чисел Фибоначчи.

module fibonacci;

import std.stdio;

ulong iterative(ulong x)
{
    ulong prev1 = 1L;
    ulong prev2 = 1L;
    ulong result = x <= 2 ? 1L : 0L;
    
    for ( ulong i = 3; i <= x; ++i )
    {
        result = prev1 + prev2;
        prev1 = prev2;
        prev2 = result;
    }
    return result;

}

int main()
{
	for (uint i = 1; i < 17; i++)
	{
		writef("%s, ", iterative(i));
	}
	writefln("%s", "...");
	
	return 0;
}

Пример для версий Perl 5.12.1

Используется рекурсивное определение чисел Фибоначчи.

sub fibonacci {
  my $n = shift;
  $n < 3 ? 1 : fibonacci($n-1) + fibonacci($n-2)
}
 
foreach (1..16) {
  print fibonacci($_), ", ";
}
print "..."

Пример для версий Ruby 1.8.5, Ruby 1.9.0, Ruby 1.9.2

Используется рекурсивное определение чисел Фибоначчи.

def fibonacci(n)
    if n < 3
        1
    else
        fibonacci(n - 1) + fibonacci(n - 2)
    end
end
 
(1..16).each {|n| puts "#{fibonacci(n)}, "}
puts "..."

Пример для версий gmcs 2.0.1

Используется рекурсивное определение чисел Фибоначчи.

using System;

class Program
{
    static long Fibonacci(int n)
    {
        if (n < 3)
            return 1;
        else
            return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
    static void Main(string[] args)
    {
        for (int i = 1; i < 17; i++)
            Console.Write("{0}, ", Fibonacci(i));
        Console.WriteLine("...");
    }
}

Пример для версий gcc 3.4.5, gcc 3.4.5 (Objective-C), TCC 0.9.25

Используется рекурсивное определение чисел Фибоначчи.

#include <stdio.h>

int fibonacci(int n)
{
    return ( n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2) );
}

int main(void)
{
    int n;
    for (n=1; n<=16; n++)
        printf("%d, ", fibonacci(n));
    printf("...\n");
    return 0;
}

Пример для версий Scratch 1.4

В Scratch нет простого способа определить функцию, поэтому используется итеративное определение чисел Фибоначчи.

set f1 to 1
set f2 to 1
set str to f1
repeat 15
   set f3 to (f1 + f2)
   set f1 to f2
   set f2 to f3
   set str to join (str (join (,) f1))
say join (str (...))

Числа Фибоначчи на Scratch
Числа Фибоначчи на Scratch

Пример для версий Sanscript 2.2

Числа Фибоначчи вычисляются так же, как факториал: цикл-Repeat вычисляет список чисел, начиная с двух первых, после чего список конкатенируется в выводимое сообщение. Внутри цикла текущее число добавляется к списку и заменяется на следующее, а следующее — на сумму текущего и следующего.

Числе Фибоначчи на Sanscript - главная диаграмма потоков
Числе Фибоначчи на Sanscript - главная диаграмма потоков

Числе Фибоначчи на Sanscript - блок Repeat
Числе Фибоначчи на Sanscript - блок Repeat

Пример для версий gc-2010-07-14

В этом примере показаны все три способа вычисления чисел Фибоначчи.

package main
import ("fmt"
        "math")

//Fibonacci Recursive
func fibr(n int) int {
    if n < 2 { return 1 }
    return fibr(n-2) + fibr(n-1)
}

//Fibonacci Iterative
func fibi(n int) int {
    var a, b int = 1, 1
    for i := 0; i < n; i++ {
        a, b = b, a+b
    }
    return a
}

//Fibonacci Binet
func fibb(n int) int {
    g := (1 + math.Sqrt(5)) / 2
    ret := (math.Pow(g, float64(n)) - math.Pow(1-g, float64(n))) / math.Sqrt(5)
    return int(ret)
}

type fibfunc func(int) int

//Implements a general printing method for fibonacci functions
func printFib(fib fibfunc, a, b int) {
    for i := a; i < b; i++ {
        fmt.Printf("%d, ", fib(i))
    }
    fmt.Println("...")
}

func main() {
    printFib(fibr, 0, 16)
    printFib(fibi, 0, 16)
    printFib(fibb, 1, 17)
}

Пример для версий GNU bc 1.06

Используется рекурсивное определение чисел Фибоначчи.

define fibonacci(n) {
    if (n <= 2) return(1);
    return(fibonacci(n-1)+fibonacci(n-2));
}
 
for (n = 1; n <= 16; n++) {
    print fibonacci(n); ", "
}
print "..."
quit

Пример для версий GNU bc 1.06

Используется формула Бине. Следует отметить, что bc — калькулятор произвольной точности, поэтому выводить числа приходится с округлением до целого. Для этого устанавливается точность 0 знаков после десятичной точки, и x округляется вручную (встроенной функции округления в bc нет).

for (n = 1; n <= 16; n++) {
    scale = 10
    x = (((1 + sqrt(5)) * .5) ^ n - ((1 - sqrt(5)) * .5) ^ n) / sqrt(5)
    scale = 0
    print (x+0.5)/1; ", "
}
print "..."

Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.x

Пример почти идентичен примеру для Poplog Prolog, за исключением синтаксиса подключения файла.

% fibonacci.pl
:- dynamic(stored/1).

memo(Goal) :-
    stored(Goal) -> true;
    Goal, assertz(stored(Goal)).

fib(1,1) :- !, write('1, ').
fib(2,1) :- !, write('1, ').
fib(N,F) :-
    N1 is N-1, memo(fib(N1,F1)), 
    N2 is N-2, memo(fib(N2,F2)), 
    F is F1 + F2,
    write(F), write(', ').

% interactive
[fibonacci].
fib(16,X), write('...'), nl.

Пример для версий gnuplot 4.2.2

Используется итеративное определение чисел Фибоначчи. В gnuplot этой версии нет циклов, поэтому цикл имитируется вызовом другого файла. Если печатать числа отдельными командами, они будут выводиться на отдельных строках, поэтому для накопления вычисленных чисел используется строка, которая выводит на печать все сразу после конца цикла.

### run.gp
#!/usr/bin/env gnuplot
i = 1
a = 1
b = 1
res = ''
load "fibonacci.gp"
print res, '...'

### fibonacci.gp
res = res . a . ', '
c = a
a = b
b = b+c
i = i+1
if (i <= 16) reread

Пример для версий boo 0.8.2

Используется итеративное определение чисел Фибоначчи.

a = array(int, 16)
a[0] = a[1] = 1
for i in range(2,16):
    a[i] = a[i-1] + a[i-2]
s=""
for i in range(16):
    s = s + a[i] + ", "
print(s + "...")

Пример для версий boo 0.8.2

В этом примере показано использование генератора fib — конструкции, которая инициализирует внутренние переменные a и b и при каждом следующем обращении изменяет их значения и выдает наружу. Функция zip “склеивает” элементы двух перечислений (в данном случае range(16) и генератора) в пары, создавая новое перечисление.

def fib():
    a, b = 0, 1
    while true:
        yield b
        a, b = b, a + b
 
s=""
for i, n in zip(range(16), fib()):
    s = s+n+", "
print(s+"...")

Пример для версий gforth 0.7.0

Используется итеративное определение чисел Фибоначчи.

: fib-iter
  0 1 rot 0 ?do over + swap loop drop ;
 
: lp
  1 do
    i dup fib-iter . ." , "
  loop drop ;
 
17 lp
." ..."

Пример для версий gforth 0.7.0

Используется рекурсивное определение чисел Фибоначчи.

: fib-rec
  dup 2 u< if exit then
  1- dup recurse  swap 1- recurse  + ;
 
: lp
  1 do
    i dup fib-rec . ." , "
  loop drop ;
 
17 lp
." ..."

Пример для версий C-INTERCAL 28.0, J-INTERCAL 0.11, J-INTERCAL 0.12

Используется итеративное определение чисел Фибоначчи. В переменных .11 и .12 хранятся предыдущее и текущее числа, в .9 — количество остающихся итераций.

Тело цикла довольно простое — напечатать число .11, скопировать .10 и .11 в .1 и .2, сложить их ((1009) NEXT вызывает сложение из стандартной библиотеки и записывает сумму в .3) и обновить значения. Самая сложная часть программы — код, обеспечивающий циклическое поведение. Вот что он делает:

(3) NEXT и (4) NEXT обеспечивают переход на метку (4). Здесь счетчик цикла .9 уменьшается на 1 (вызов (1010)). После этого .1 вычисляется побитовыми операциями и становится 1, если .9 содержит ненулевое значение, и 0 в противном случае, и затем увеличивается на 1. Наконец, RESUME .1 возвращает выполнение программы к одному из более ранних NEXT. Если .1 равно 2, программа возвращается на два NEXT назад и продолжает выполняться с DO (1) NEXT, возвращаясь к началу тела цикла. Если же .1 равно 1, программа возвращается на один NEXT назад, продолжает выполняться с PLEASE GIVE UP и останавливается.

Вывод программы выглядит следующим образом:

I                                                               

I                                                               

II                                                              

III                                                             

V                                                               

VIII                                                            

XIII                                                            

XXI                                                             

XXXIV                                                           

LV                                                              

LXXXIX

CXLIV

CCXXXIII

CCCLXXVII

DCX

CMLXXXVII
    DO .9 <- #16
    DO .10 <- #0
    DO .11 <- #1

(1) PLEASE READ OUT .11
    DO .1 <- .10
    DO .2 <- .11
    PLEASE (1009) NEXT
    DO .10 <- .11
    DO .11 <- .3

    DO (3) NEXT
    DO (1) NEXT

(3) DO (4) NEXT
    PLEASE GIVE UP

(4) DO .1 <- .9
    DO .2 <- #1
    PLEASE (1010) NEXT
    DO .9 <- .3
    DO .1 <- '.9~.9'~#1
    PLEASE (1020) NEXT
    DO RESUME .1

Пример для версий BlackBox Component Builder 1.5

Используется рекурсивное определение чисел Фибоначчи.

MODULE Fibonacci;

IMPORT StdLog;

PROCEDURE fibonacci(n: INTEGER): INTEGER;
BEGIN
    IF n < 3 THEN
        RETURN 1;
    ELSE
        RETURN fibonacci(n-1)+fibonacci(n-2)
    END;
END fibonacci;

PROCEDURE Do*;
VAR
    n: INTEGER;
BEGIN
    FOR n := 1 TO 16 DO
        StdLog.Int(fibonacci(n));
        StdLog.String(', ');
    END;
    StdLog.String('...');
    StdLog.Ln;
END Do;

END Fibonacci.
Fibonacci.Do

Пример для версий Mozart 1.4.0

Используется рекурсивное определение чисел Фибоначчи. Отметим, что в языке Oz значения переменным можно присваивать только один раз, поэтому для накопления вывода приходится использовать тип Cell — контейнер на один элемент.

functor
 
import
   Application System

define 
   fun{Fib N}
      fun{Loop N A B}
         if N == 0 then
            B
         else
            {Loop N-1 A+B A}
         end
      end
   in    
      {Loop N 1 0}
   end

local
   S
in
   S = {NewCell ""}
   for I in 1..16 do
        S := {Append {Append @S {Int.toString {Fib I}}} ", "}
   end
   {System.showInfo {Append @S "..."}}
   {Application.exit 0}
end

end

Пример для версий Mozart 1.4.0

Используется итеративное определение чисел Фибоначчи.

functor
 
import
   Application System

define 

local
   A B C S
in
   A = {NewCell 0}
   B = {NewCell 1}
   C = {NewCell 0}
   S = {NewCell ""}
   for I in 1..16 do
       C := @A + @B
       A := @B
       B := @C
       S := {Append {Append @S {Int.toString @A}} ", "}
   end
   {System.showInfo {Append @S "..."}}
   {Application.exit 0}
end

end

Пример для версий GHC 6.8.1

Этот пример также использует ленивые вычисления, но иначе формирует вывод нужного формата.

main = putStrLn $ withDots $ join $ take 16 fibs
       where fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
             join = foldl (\a b -> a ++ show b ++ ", " ) "" 
             withDots = (++ "...")

Пример для версий gst 3.1

Используется итеративное определение чисел Фибоначчи.

a1 := 0.
a2 := 1.
0 to: 15 do: [ :i |
  a2 display.
  t := a1 + a2.
  a1 := a2.
  a2 := t.
  ', ' display
]
'...' displayNl.

Пример для версий Müller's Brainfuck 2.0

Этот пример является переводом на Unary этого примера. Сам код слишком обширен, чтобы приводить его полностью, поэтому указана только его длина.

A string of 
146778148267671308907956810331954494567788969820594569869966345643952713144
716974835554679004232198811425384864927587749892052914319949694507679080918
662111668706252645905597146857061868763596677983948203224834326028677131466
814323099384842068831692029352209655371798175735992788874417787727414767365
600708388513171998134124513036377960362194431944262896105838957344640161915
106378867996851411865254464299481964724009334722033995112813417289458551426
925973669722270280516592327343992579166227546099835941334220 zeros (approximately 1.5*10^509)

Пример для версий ActiveTcl 8.5, Tcl 8.5.7

Используется итеративное определение чисел Фибоначчи. lassign присваивает последовательные элементы списка, переданного в качестве первого аргумента (в данном случае — созданного командой [list ...]), переменным, заданным следующими аргументами (fib1 и fib2). Эта команда была перенесена в основной язык в версии Tcl 8.5, до того она входила в пакет TclX.

set fib1 0
set fib2 1
set s ""
for {set i 0} {$i < 16} {incr i} {
    lassign [list $fib2 [incr fib2 $fib1]] fib1 fib2
    append s "$fib1, "
}
puts "$s..."

Пример для версий ActiveTcl 8.5, Tcl 8.5.7

Для вычисления чисел Фибоначчи используется рекурсия. Функция fib определяется в пространстве имен tcl::mathfunc, для того, чтобы ее можно было использовать как функцию в выражениях expr.

proc tcl::mathfunc::fib {n} {
    if {$n<=1} {
        return 1
    } else {
        return [expr fib([expr {$n - 1}]) + fib([expr {$n - 2}])]
    }
}

set s ""
for {set i 0} {$i < 16} {incr i} {
    append s [expr fib($i)] ", "
}
puts "$s..."

Пример для версий Bash 3.0, Bash 4.0.35, Bash 4.1.5

Используется итеративное определение чисел Фибоначчи.

a=0
b=1
 
for (( n=1; $n<=16; n=$n+1 ));
do
  a=$(($a + $b))
  echo -n "$a, "
  b=$(($a - $b))
done
echo "..."

Пример для версий Miller's Hack VM (JavaScript), Miller's Hack VM (Python)

Этот пример использует итерацию и работает так же, как в других эзотерических языках: ячейка памяти 0 хранит оставшееся количество чисел для вычисления, ячейки 1 и 2 хранят ASCII-коды запятой и пробела, ячейки 3 и 4 — два последних рассчитанных числа Фибоначчи. В цикле извлекаются значения ячеек 3 и 4, суммируются, новое значение выводится на печать, а ячейки памяти обновляются. После этого количество оставшихся чисел уменьшается на 1, и если оно становится 0, счетчик программы (эквивалент указателя инструкций в Brainfuck) перемещается на 6 символов вперед и выходит из цикла, в противном случае он возвращается обратно к началу цикла. Наконец, выводятся три точки.

27*0> 92+4*1> 84*2> 10^p3> 1<P 2<P 10^p4> 1<P 2<P 3< 4< + 0^p 4< 3> 4> 0< 1- 0> 0<  6? 67*c 58*6+0^0^PPP

Пример для версий Roco 20071014

Используется итеративное определение чисел Фибоначчи. Все числа хранятся в ячейках [2]..[17]. В ячейке [0] хранится номер следующего числа, ячейка [1] используется как временная переменная. Циклы реализованы как сопрограммы, поскольку по определению каждая сопрограмма выполняется циклически, до вызова другой сопрограммы или прерывания текущей.

co calc{
/* break the loop when the counter is 2+16, since numbers start with cell 2 */
eq [1] [0] 18
if [1] ac

/* calculate next number and store it to [[0]]*/
sub [1] [0] 1
set [[0]] [[1]]
sub [1] [0] 2
add [[0]] [[0]] [[1]]

/* output */
iout [[0]]
cout 44
cout 32

/* increment counter */
add [0] [0] 1
}

/* initialize with first Fibonacci numbers */
set [0] 4
set [2] 1
set [3] 1

iout [2]
cout 44
cout 32
iout [3]
cout 44
cout 32

ca calc

cout 46
cout 46
cout 46
ac

Пример для версий fsharp 2.0.0

Используется рекурсивное определение чисел Фибоначчи “в лоб”.

let rec fibonacci n =
    match n with
    | 1 | 2 -> 1
    | _ -> fibonacci (n-1) + fibonacci (n-2)

let rec printFib n  =
    match n with 
    | 1 -> printf "%d, " (fibonacci (n))
    | _ -> printFib (n-1)
           printf "%d, " (fibonacci (n))
           
printFib(16)
printfn "..."

Пример для версий ncc 0.9.3

Используется рекурсивное определение чисел Фибоначчи, записанное в функциональном стиле. Следует отметить объявление счетчика цикла i — ключевое слово mutable, в отличие от обычного def, означает, что переменная будет изменяться.

def fib(i)
{
  | x when x<2 => 1
  | _          => fib(i - 2) + fib(i - 1)
}
 
mutable i=0;
while (i<16)
{   System.Console.Write("{0}, ", fib(i));
    i++;
}
System.Console.WriteLine("...");

Пример для версий Web2c 2009

Данный пример использует итеративный процесс для расчета чисел Фибоначчи.

В макросе \fibonacci используются двойные фигурные скобки, т.к. в макросе присутствует цикл, который вызывается внутри другого цикла.

\newcount\n \newcount\np \newcount\npp \newcount\m \newcount\f

\def\fibonacci#1{{\ifnum #1<3 1\else
\np=1\npp=1\m=3
\loop\ifnum\m<#1\f=\npp\npp=\np\advance\np by\f\advance\m by 1\repeat
\f=0\advance\f by\np\advance\f by\npp
\number\f\fi}}

\def\printfibonacci#1{\m=#1\advance\m by 1
\n=1
\loop\ifnum\n<\m\fibonacci{\n}, \advance\n by 1\repeat...}

\printfibonacci{16}
\bye

Пример для версий EsCo 0.511 (Brainfuck)

Пример на COW. Аналогичен этому примеру, но вывод чисел на печать существенно упрощается за счет команды OOM; фактически, даже с более длинными командами пример лаконичнее исходного.

MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO 
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO 
                                            c1v44 : ASCII code of comma
moO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO 
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
                                            c2v32 : ASCII code of space
moO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
                                            c3v11 : quantity of numbers to be calculated
moO                                         c4v0  : zeroth Fibonacci number (will not be printed)
moO MoO                                     c5v1  : first Fibonacci number
mOo mOo                                     c3    : loop counter
MOO                                         block : loop to print (i)th number and calculate next one
moO moO OOM                                 c5    : the number to be printed
mOo mOo mOo mOo Moo moO Moo                 c1c2  : print comma and space
                                            block : actually calculate next Fibonacci in c6
moO moO MOO moO moO MoO mOo mOo MOo moo     c4v0  : move c4 to c6 (don't need to preserve it)
moO MOO moO MoO mOo mOo MoO moO MOo moo     c5v0  : move c5 to c6 and c4 (need to preserve it)
moO MOO mOo MoO moO MOo moo                 c6v0  : move c6 with sum to c5
mOo mOo mOo MOo                             c3    : decrement loop counter
moo 
mOo mOo MoO MoO Moo Moo Moo                 c1    : output three dots

Пример для версий Baltie 3

Используется итеративный способ вычисления чисел Фибоначчи. Иконки A..D — глобальные переменные (голубые — целочисленные, желтые — строковые). Стрелка влево — оператор присваивания. Цикл for получает в качестве аргументов переменную-счетчик цикла, начало и конец интервала. Иконка с двойной кавычкой — преобразование числовой переменной в строку.

Числа Фибоначчи на Baltie 3
Числа Фибоначчи на Baltie 3

Числа Фибоначчи на Baltie 3 (результат)
Числа Фибоначчи на Baltie 3 (результат)

Пример для версий Io-2008-01-07

В этом примере используется итерачивное вычисление чисел Фибоначчи. В цикле for пропущен четвертый аргумент, задающий шаг цикла — по умолчанию он равен 1.

N0 := 0;
N1 := 1;
for(i,1,16,
   N2 := N1+N0;
   N0 := N1;
   N1 := N2;
   N0 print;
   ", " print;
);
"..." println; 

Пример для версий Io-2008-01-07

В этом примере для вычисления чисел Фибоначчи используется формула Бине. Математические функции также вызываются посредством передачи сообщения объекту-числу.

g := (5 sqrt + 1) / 2;
for(i,1,16,
   N := ((g pow(i)) - ((1-g) pow(i))) / (5 sqrt);
   N round print;
   ", " print;
);
"..." println; 

Пример для версий Objective Caml 3.10.2

Используется рекурсивный метод вычисления чисел Фибоначчи.

let rec fibonacci n =
  if n < 3 then
    1
  else
    fibonacci (n-1) + fibonacci (n-2)

let () =
  for n = 1 to 16 do
    Printf.printf "%d, " (fibonacci n)
  done;
  print_endline "..."

Пример для версий MLton 20070826, Moscow ML 2.01, SML/NJ 110.69

Используется итеративное определение чисел Фибоначчи.

val n = ref 0;
val fib0 = ref 1;
val fib1 = ref 1;
val sum = ref 0;
val res = ref "";
while !n <= 15 do (
  res := !res ^ (Int.toString(!fib0) ^ ", ");
  sum := !fib0 + !fib1;
  fib0 := !fib1;
  fib1 := !sum;
  n := !n + 1
);
print (!res ^ "...\n");;

Пример для версий Online Cat 1.3

В этом примере используется рекурсивное определение чисел Фибоначчи. Прежде всего определяется функция fib, работающая следующим образом.

При вызове функции верхний элемент стека N — номер числа, которое нужно вычислить (это единственный способ передать аргумент в функцию в Cat). Последовательность команд dup 1 <= копирует верхний элемент, сравнивает его с 1 и добавляет в стек true, если он меньше или равен 1, и false в противном случае. Затем следует условное выражение: в стек добавляются две последовательности команд (выделенные в блоки [...]), и если третий сверху элемент стека — true, выполняется первая из них, иначе — вторая. В данном случае последовательность для true пуста (Fib(0)=0, Fib(1)=1, и вычисления не нужны), последовательность для false следующая. Скопировать верхний элемент стека (это снова N), уменьшить его на 1, вызвать функцию fib для N-1, которая заменит N-1 на Fib(N-1). Затем поменять местами два верхних элемента стека (Fib(N-1) N), уменьшить верхний элемент на 2 и вызвать функцию fib, которая заменит его на Fib(N-2). Наконец, два верхних элемента стека суммируются, чтобы получить искомое Fib(N).

Вторая часть программы — цикл while по индексам от 1 до 16, который вычисляет числа и выводит их на печать. Тело цикла [dup fib write ", " write inc] копирует верхний элемент стека, вычисляет соответствующее число Фибоначчи, печатает его и запятую после него и увеличивает счетчик цикла. [dup 16 lteq] — условие повторения цикла: счетчик меньше или равен 16.

define fib {
    dup 1 <=
        []
        [dup 1 - fib swap 2 - fib +]
    if
}

    1
    [dup fib write ", " write inc]
    [dup 16 lteq]
while
"..." writeln

Пример для версий 64-bit BCPL Cintcode System (1 Nov 2006)

Используется рекурсивный метод вычисления чисел Фибоначчи.

GET "libhdr"

LET start() = VALOF
{ FOR i = 0 TO 15 DO writef("%n, ", fibonacci(i))
  writef("...*n")
  RESULTIS 0
}

AND fibonacci(n) = n<2 -> 1, fibonacci(n-1)+fibonacci(n-2)

Пример для версий rakudo-2010.08

Используется рекурсивное определение чисел Фибоначчи. ~ — оператор конкатенации. $_ — переменная по умолчанию, в данном случае счетчик цикла.

sub fibonacci($n) {
  $n > 1 or return $n;
  return fibonacci($n-1) + fibonacci($n-2);
}

my $st = "";
for 1..16 {
  $st ~= fibonacci($_) ~ ", ";
}
say $st, "..."

Пример для версий OpenCOBOL 1.0, TinyCOBOL 0.65.9

Используется итеративное вычисление чисел Фибоначчи. Сложение чисел Фибоначчи выполняется командой ADD, которая суммирует два аргумента и сохраняет результат в третий. Из-за того, что команда DISPLAY делает перевод строки после каждого вызова, найденные числа приходится сохранять в строку-результат, которая выводится уже после цикла. Для конкатенации нового числа с предыдущими используется команда STRING; для каждой переменной из тех, которые объединяются в строку, указывается опция DELIMITED BY: SIZE — используется вся переменная, SPACE — часть переменной до первого пробела. Из-за этого числа выводятся без пробелов после запятых:

001,001,002,003,005,008,013,021,034,055,089,144,233,377,610,987,...
       IDENTIFICATION DIVISION.
       PROGRAM-ID. SAMPLE.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

         77 fib1 pic 999.
         77 fib2 pic 999.
         77 fib3 pic 999.
         77 i pic 99.
         77 fibst pic XXX.
         77 res pic X(64).

       PROCEDURE DIVISION.
         move 0 to i
         move 0 to fib1
         move 1 to fib2
         move "" to res
         perform until i greater than 15
           add fib1 to fib2 giving fib3
           move fib2 to fib1
           move fib3 to fib2
           move fib1 to fibst
           string res   DELIMITED BY SPACE
                  fibst DELIMITED BY SIZE
                  ","   DELIMITED BY SIZE into res
           add 1 to i
         end-perform.
         display res "..."
         stop run.

Пример для версий Groovy 1.7

Используется простейшее рекурсивное определение чисел Фибоначчи.

def fib
fib = { n ->
   (n <= 2 ? 1 : fib(n-1) + fib(n-2) )
}

(1..16).each { print "${fib(it)}, " }
println "..."

Пример для версий Falcon 0.9.6.6

Используется рекурсивное определение чисел Фибоначчи.

function fib(n)
    if n <= 2 :  return 1
    return fib(n-1) + fib(n-2)
end

for i in [1:17]
    print (fib(i), ", ")
end
printl ("...")

Пример для версий Clojure 1.0.0, Clojure 1.1.0

Используется рекурсивное вычисление чисел Фибоначчи.

(defn fibonacci [x]
  (if (< x 2)
    x
    (+ (fibonacci (- x 1)) (fibonacci (- x 2)) )))

(doseq [i (range 1 17)]
  (print (str (fibonacci i) ", ")))
(println "...")

Пример для версий guile 1.8.5, JScheme 7.2, MIT/GNU Scheme 7.7.9

Используется рекурсивное определение чисел Фибоначчи.

(define (fibonacci x)
  (if (< x 2)
    x
    (+ (fibonacci (- x 1)) (fibonacci (- x 2)))))

(do ((i 1 (+ i 1)))
  ((> i 16))
    (display (string-append (number->string (fibonacci i)) ", ")))
(display "...")
(newline)

Пример для версий Acme-Chef-1.01

Используется итеративное определение чисел Фибоначчи. Последнее и предпоследнее числа хранятся в переменных fib1 и fib2. За одну итерацию вычисляется следующее число, а предыдущее дописывается в стек и остается в нем для последующего вывода. Второй цикл пересыпает значения во вторую миску в обратном порядке, чтобы на печать они выводились в правильном порядке, по возрастанию.

Данная версия интерпретатора не позволяет работать с символами и числами вперемешку, поэтому формат вывода не соблюдается, и результат работы программы выглядит следующим образом:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Fibonacci numbers.

This recipe calculates and prints first Fibonacci numbers.

Ingredients.
0 g fib1
1 g fib2
16 g iterator
16 g second iterator

Method.
Chop iterator.
Put fib2 into 1st mixing bowl.
Put fib2 into 1st mixing bowl.
Add fib1 into 1st mixing bowl.
Fold fib2 into 1st mixing bowl.
Fold fib1 into 1st mixing bowl.
Put fib1 into 1st mixing bowl.
Chop iterator until choped.
Mash second iterator.
Fold fib1 into 1st mixing bowl.
Put fib1 into 2nd mixing bowl.
Mash second iterator until mashed.
Pour contents of 2nd mixing bowl into the baking dish.

Serves 1.

Пример для версий Pike 7.6, Pike 7.8

Используется рекурсивное определение чисел Фибоначчи.

int fibonacci(int n) {
    return ( n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2) );
}

int main() {
    for (int n=1; n<=16; n++)
        write(fibonacci(n)+", ");
    write("...\n");
    return 0;
}

Пример для версий befungee 0.2.0

Используется итеративное определение чисел Фибоначчи.

В этом примере используются команды p и g, предназначенные для модификации исходного кода программы в процессе выполнения, — они записывают заданный символ в заданную клетку программы и считывают его оттуда в стек, соответственно. В данном случае это используется для хранения вычисленных чисел Фибоначчи (счетчик цикла все время хранится в стеке). При записи чисел как ASCII-кодов символов большие числа искажаются, поэтому выводятся только первые 13 штук.

031p132p 94+ > 31g 32g :. + 32g v
             | :-1,,", "p23 p13 <
             > "."::,,,25*,@

Пример для версий Morphett's FALSE, Wouter's FALSE 1.2.CF

Используется итеративное вычисление чисел Фибоначчи. Текущие числа хранятся в переменных a и b, счетчик цикла — в i.

Второй цикл примера очищает содержимое стека (числа Фибоначчи, записанные в него первым циклом). Некоторые интерпретаторы позволяют оставлять данные в стеке после конца работы программы, но, к примеру, Wouter’s FALSE 1.2.CF требует, чтобы стек был пустым, и выдает ошибку выполнения в противном случае.

0i: 1a: 1b:
[i;16=~]
[a; $. ", " $ b; $ a: + b: i;1+i:]
#
"..."

[1=~]
[]
#
%

Пример для версий Objeck 2.0.3

Используется рекурсивное определение чисел Фибоначчи.

bundle Default {
    class Fib {
        function :  Fibonacci (n: Int) ~ Int {
            if (n<=2) {
                return 1;
            };
            return Fibonacci(n-1) + Fibonacci(n-2);
        }
        function : Main(args : String[]) ~ Nil {
            for (i := 0; i <= 16; i += 1;) {
                Fibonacci(i)->Print();
                ", "->Print();
            };
            "..."->PrintLine();
        }
    }
}

Пример для версий Lingua::Shakespeare 1.00

Используется итеративное вычисление чисел Фибоначчи. После выхода из цикла (конец второй сцены) счетчик цикла Isabella используется для вывода троеточия.

use Lingua::Shakespeare;

Fibonacci Numbers.

Isabella, the loop index.
Falstaff, a Fibonacci number.
Fortinbras, another Fibonacci number.
Sebastian, space.
Cordelia, comma.

Act I: Factorial calculations.

Scene I: Initialization.

[Enter Isabella and Sebastian]

Isabella:
  You are as fat as the product of a big black furry old cat and a white cow!

[Exit Sebastian]
[Enter Cordelia]

Isabella:
  You are as beautiful as the sum of Sebastian and the sum of a tiny yellow furry hamster and the clearest blue sky!

[Exit Cordelia]
[Enter Fortinbras]

Isabella:
  You father!

Scene II: Loop.

Isabella:
  Open your heart!
  You are as noble as the sum of yourself and Falstaff.

[Exit Fortinbras]
[Enter Falstaff]

Isabella:
  You are as brave as the difference between Fortinbras and yourself.

[Exit Falstaff]
[Enter Cordelia]

Isabella:
  Speak your mind!

[Exit Cordelia]
[Enter Sebastian]

Isabella:
  Speak your mind!

[Exit Sebastian]
[Enter Fortinbras]

Fortinbras:
  You are as good as the sum of yourself and a rose.

Isabella:
  Am I not as beautiful as your sweet charming lovely noble sister?

Fortinbras:
  If so, let us return to scene II.
  You are as good as the sum of Cordelia and a fine horse!
  Speak your mind! Speak your mind! Speak your mind!

[Exeunt]

Пример для версий npiet 1.2

Этот пример сгенерирован автоматически. Ниже приведена исходная программа, из которой он был получен. Используется итеративное вычисление чисел Фибоначчи.

main()
{
  f1 = 0;
  f2 = 1;
  for ( i = 1; i <= 16; i++ )
  {
    __outn(f2);
    __out(44);
    __out(32);
    f2 = f1 + f2;
    f1 = f2 - f1;
  }
  __out(46);
  __out(46);
  __out(46);
  __out(10);
}

Числа Фибоначчи на Piet
Числа Фибоначчи на Piet

Числа Фибоначчи на Piet (увеличение 4x)
Числа Фибоначчи на Piet (увеличение 4x)

Пример для версий GNU Octave 3.2.3

Используется рекурсивное определение чисел Фибоначчи.

function f = fib(n)
  if (n <= 1)
    f = n;
  else
    f = fib(n - 1) + fib(n - 2);
  endif
endfunction

for i = 1 : 16
  printf("%d, ", fib(i));
endfor
disp("...");

Пример для версий APS APLAN

В языке не предусмотрены операции работы со строками, а команды вывода на печать обязательно заканчивают выведенное переводом строки, поэтому форматирование не соблюдено — числа выводятся просто в столбик.

INCLUDE <include/std.ap>

NAMES fibonacci, print_fibonacci;

fibonacci := rs(x) (
    0 = 1,
    1 = 1,
    x = fibonacci(x - 1) + fibonacci(x - 2)
);

print_fibonacci := proc(n)loc(i, res)(
    i := 0;
    while(i < n,
        prn fibonacci(i);
        i := i + 1
    )
);

task := print_fibonacci 16 ;

Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7

Используется итеративное определение чисел Фибоначчи.

set fib1 0
set fib2 1
set s ""
for {set i 0} {$i < 16} {incr i} {
    set fib3 [expr {$fib1 + $fib2}]
    set fib1 $fib2
    set fib2 $fib3
    append s "$fib1, "
}
puts "$s..."

Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7

Для вычисления чисел используется хвостовая рекурсия. Команда eval позволяет вычислить результат вызова функции fib с заданными аргументами без объявления fib в определенном пространстве имен.

proc fib {f1 f2 n} {
    if {$n==0} {
        return $f1
    } else {
        return [eval fib $f2 [expr {$f1 + $f2}] [expr {$n - 1}]]
    }
}

set s ""
for {set i 0} {$i < 16} {incr i} {
    append s [eval fib 1 1 $i] ", "
}
puts "$s..."

Пример для версий Seed7 2012-01-01

Используется рекурсивное определение чисел Фибоначчи.

$ include "seed7_05.s7i";

const func integer: fibonacci (in var integer: n) is func
result
    var integer: result is 1;
begin
    if n < 2 then
        result := 1;
    else
        result := fibonacci(n - 1) + fibonacci(n - 2);
    end if;
end func;

const proc: main is func
local
    var integer: n is 0;
begin
    for n range 0 to 15 do
        write(fibonacci(n) <& ", ");
    end for;
    writeln("...");
end func;

Пример для версий Regina 3.3

В этом примере используется рекурсивное определение чисел Фибоначчи.

  numbers = ''
  do n = 1 to 16
    numbers = numbers||fibonacci(n)", "
  end
  say numbers"..."
exit

fibonacci: procedure
  parse arg n .
  if n < 3 then
    n = 1
  else
    n = fibonacci(n-1) + fibonacci(n-2)
  return n

Пример для версий Regina 3.3

В этом примере используется итеративное вычисление чисел Фибоначчи. Массивы реализованы как “корневые переменные”: обращение к элементам массива идет по их индексам fib.1 (или fib.first).

  fib.0 = 0
  fib.1 = 1
  output = fib.1||', '

  do f = 2 to 16
    e = f - 1; d = f - 2
    fib.f = fib.e + fib.d
    output = output||fib.f', '
  end

  say output"..."
exit

Пример для версий Python 2.6.5

Используется рекурсивное определение чисел Фибоначчи.

def fibonacci(n):
    if n < 3:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

for n in range(1, 16 + 1):
    print "%i," % fibonacci(n) ,
print "..."

Пример для версий Rust 0.1

Используется рекурсивное вычисление чисел Фибоначчи.

use std;
import std::io;

fn fibonacci(x: int) -> int {
  if (x <= 2) {
    ret 1;
  } else {
    ret fibonacci(x - 1) + fibonacci(x - 2);
  }
}

fn main() {
  let i = 1;
  while i <= 16 {
    io::print(#fmt("%d, ", fibonacci(i)));
    i = i + 1;
  }
  io::println("...");
}

Пример для версий Ceylon M1

В этом примере используется итеративное вычисление чисел Фибоначчи.

void run() {
    variable String output := "";
    variable Integer fib1 := 0;
    variable Integer fib2 := 1;
    variable Integer fib3;
    for (i in 1..16) {
        output := "" output "" fib2 ", ";
        fib3 := fib1 + fib2;
        fib1 := fib2;
        fib2 := fib3;
    }
    print("" output "...");
}

Пример для версий Factor 0.94

В этом примере используется рекурсивное вычисление чисел Фибоначчи. Слово fib вычисляет n-ое число Фибоначчи: если аргумент не больше 1, он остается на стеке в качестве возвращаемого значения, иначе заменяется на сумму предыдущих чисел Фибоначчи. Слово bi является сокращенной формой комбинатора cleave и позволяет применить две цитаты (в данном случае вызовы слова fib для меньших аргументов) к одному элементу стека (n).

USING: formatting kernel math sequences ;
IN: fibonacci-example

: fib ( n -- fib(n) )
    dup
    1 >
    [ [ 1 - fib ] [ 2 - fib ] bi + ]
    when ;

16 iota [ 1 + fib "%d, " printf ] each 
"...\n" printf

Пример для версий loljs 1.1

Числа Фибоначчи вычисляются итеративно.

HAI
  I HAS A I ITS 0
  I HAS A FIB1 ITS 0
  I HAS A FIB2 ITS 1
  IM IN YR LOOP UPPIN YR I TIL BOTH SAEM I AN 16
    VISIBLE SMOOSH FIB2 ", "!
    I HAS A FIB3 ITS SUM OF FIB1 AN FIB2
    FIB1 R FIB2
    FIB2 R FIB3
  IM OUTTA YR LOOP
  VISIBLE "..."
KTHXBYE

Пример для версий loljs 1.1

Числа Фибоначчи вычисляются рекурсивно.

HAI
  HOW DUZ I FIBONACCI N
    BOTH SAEM 1 AN BIGGR OF N AN 1, O RLY?
      YA RLY
        FOUND YR 1
      NO WAI
        FOUND YR SUM OF FIBONACCI DIFF OF N AN 1 AN FIBONACCI DIFF OF N AN 2
    OIC
  IF U SAY SO
  
  I HAS A N ITZ 0
  IM IN YR LOOP UPPIN YR N WILE N SMALLR THAN 16
    VISIBLE SMOOSH FIBONACCI N ", "!
  IM OUTTA YR LOOP
  VISIBLE "..."
KTHXBYE

Пример для версий PostgreSQL 9.1

WITH RECURSIVE t(a,b) AS (
        VALUES(1,1)
    UNION ALL
        SELECT b, a + b FROM t
        WHERE b < 1000
   )
SELECT array_to_string(array(SELECT a FROM t), ', ') || ', ...';

Пример для версий Dyalog APL 13.1

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

Поскольку функция унарна и определяется через скалярные функции, ее можно применить к массиву, в данном случае к массиву номеров чисел Фибоначчи от 1 до 16, включительно. Результатом будет массив чисел Фибоначчи:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

{phi(1+5*0.5)÷2 ⋄ ⌈((phi*) - (1-phi)*)÷5*0.5} 1+⍳16

Пример для версий Dyalog APL 13.1

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

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

1 ,  1 ,  2 ,  3 ,  5 ,  8 ,  13 ,  21 ,  34 ,  55 ,  89 ,  144 ,  233 ,  377 ,  610 ,  987 , ...
fib{⍵≤2:1 ⋄ (∇⍵-1)+∇⍵-2}¨1+⍳16
((,/{, ', '}¨fib)),'...'

Пример для версий g++ 4.x

Используется итеративное вычисление чисел Фибоначчи; вычисленные значения сохраняются в массиве.

#include <iostream>
#include <vector>

using std::cout;
using std::vector;

int main() {
  vector<int> fib(17);
  fib[0] = 0;
  fib[1] = 1;
  for (int i = 2; i < 17; ++i) {
    fib[i] = fib[i - 2] + fib[i - 1];
  }
  for (int i = 1; i < 17; ++i) {
    cout << fib[i] << ", ";
  }
  cout << "...\n";
}

Пример для версий Nimrod 0.8.8

Используется итеративное вычисление чисел Фибоначчи. Одним ключевым словом var можно объявить сразу несколько переменных, если эти объявления отформатированы отступами как блок. Тип переменной в объявлении можно не указывать только в том случае, если она инициализируется немедленно; Nimrod использует только локальный вывод типов, не глобальный.

for i in 1..16 — альтернативная форма записи цикла countup. & — оператор конкатенации строк, $ — преобразование числа в строку.

var
  f1 = 1
  f2 = 1
  f3: int
  res = ""
for i in 1..16:
  res = res & $f1 & ", "
  f3 = f1 + f2
  f1 = f2
  f2 = f3
echo res & "..."

Пример для версий Nimrod 0.8.8

Используется формула Бине. Добавление эпсилона перед округлением необходимо для получения правильных целых значений, т.к. округление выполняется вниз.

from math import sqrt, pow, round

proc fibonacci(n: int): int =
  var phi: float64 = (1.0 + sqrt(5.0)) / 2.0
  return round((pow(phi, float64(n)) - pow(-phi, -float64(n))) / sqrt(5.0) + 0.0001)

var res = ""
for i in 1..16:
  res = res & $fibonacci(i) & ", "
echo res & "..."

Пример для версий VBA 6.3, VBA 6.5

Используется рекурсивное вычисление чисел Фибоначчи. Отметим, что в этом случае тип счетчика цикла i приходятся объявлять в явном виде, иначе он принимает тип Variant и не может быть передан в функцию вместо типа Integer.

Public Function Fibonacci(N As Integer) As Integer
  If N < 2 Then
    Fibonacci = N
  Else
    Fibonacci = Fibonacci(N - 1) + Fibonacci(N - 2)
  End If
End Function

Sub Fib()
  Dim res As String
  Dim i As Integer
  For i = 1 To 16
    res = res & CStr(Fibonacci(i)) & ", "
  Next i
  MsgBox (res & "...")
End Sub

Пример для версий VBScript 5.7, VBScript 5.8

Числа Фибоначчи вычисляются рекурсивно. Обратите внимание на то, что многие элементы, типичные для Visual Basic, здесь отсутствуют: объявление переменных и типа значения, возвращаемого функцией, явное преобразование чисел в строку для конкатенации и т.д.

Function Fibonacci(N)
  If N < 2 Then
    Fibonacci = N
  Else
    Fibonacci = Fibonacci(N - 1) + Fibonacci(N - 2)
  End If
End Function

For i = 1 To 16
  res = res & Fibonacci(i) & ", "
Next
WScript.Echo (res & "...")

Пример для версий bwBASIC 2.50

Используется итеративное вычисление чисел Фибоначчи с их запоминанием в массиве. Обратите внимание на явное объявление массива и на то, что имя строковой переменной должно заканчиваться на $.

DIM F(16)
F(1) = 1
F(2) = 1
FOR i = 3 TO 16
    F(i) = F(i - 1) + F(i - 2)
NEXT i
S$ = ""
FOR i = 1 TO 16
    S$ = S$ + STR$(F(i)) + ","
NEXT i
S$ = S$ + " ..."
PRINT S$

Пример для версий X10 Release 2.2.2.2

Рекурсивный метод

import x10.io.Console;

public class Fibonacci {

  public static def fib(n:int) {
    if (n<=2) return 1;
    
    val f1:int;
    val f2:int;
    finish {
      async { f1 = fib(n-1); }
      f2 = fib(n-2);
    }
    return f1 + f2;
  }

  public static def main(args:Array[String](1)) {
    val n = (args.size > 0) ? int.parse(args(0)) : 10;
    Console.OUT.println("Computing fib("+n+")");
    val f = fib(n);
    Console.OUT.println("fib("+n+") = "+f);
  }
}

Пример для версий ECLiPSe CLP 6.0 #188

Числа Фибоначчи вычисляются рекурсивно.

Для организации цикла в предикате main используется специфичная для ECLiPSe итеративная управляющая структура (мета-предикат) for.

fibonacci(1, 1) :- !.
fibonacci(2, 1) :- !.
fibonacci(N, F) :-
    N > 2,
    N1 is N - 1, N2 is N - 2,
    fibonacci(N1, F1), fibonacci(N2, F2),
    F is F1 + F2.

main :-
    ( for(N, 1, 16) do
        fibonacci(N, F),
        write(F), write(', ') ),
    writeln('...').

Пример для версий ECLiPSe CLP 6.0 #188

Числа Фибоначчи вычисляются рекурсивно, при этом используется мемоизация, реализованная при помощи ECLiPSe-специфичного механизма store.

Для организации цикла в предикате main используется специфичная для ECLiPSe итеративная управляющая структура (мета-предикат) for.

:- local store(fibonacci).

fibonacci(1, 1) :- !.
fibonacci(2, 1) :- !.
fibonacci(N, F) :-
    N > 2,
    ( 
        % используем сохраненный результат
        store_get(fibonacci, N, F), !
    ;
        N1 is N - 1, N2 is N - 2,
        fibonacci(N1, F1), fibonacci(N2, F2),
        F is F1 + F2,
        store_set(fibonacci, N, F) % сохраняем полученный результат
    ).

main :-
    ( for(N, 1, 16) do
        fibonacci(N, F),
        write(F), write(', ') ),
    writeln('...').

Пример для версий A++ Interpreter

В этом примере используется хвостовая рекурсия.

(load "app/init.app")

(define fibonacci (lambda(f1 f2 n)
  (if (equal n 0)
    f1
    (fibonacci f2 (+ f1 f2) (- n 1)))
))

(define main
  (lambda(n)
    (while (not (equal n 16))
      (lambda()
        (print (fibonacci 1 1 n))
        (define n (+ n 1))))))

(main 0)

Пример для версий f2c 20090411, g95 0.93, gfortran 4.5.0

Этот пример демонстрирует использование массивов в Fortran. Индексация элементов начинается с 1.

      PROGRAM FIBONACCI
        INTEGER FIB(20)
        FIB(1) = 0
        FIB(2) = 1
        DO 1,N = 2,17
          PRINT "(I3, A, $)", FIB(N), ", "
1         FIB(N + 1) = FIB(N) + FIB(N - 1)
        PRINT *, "..."
      END

Пример для версий R 2.10.1

Используется рекурсивное вычисление чисел Фибоначчи. Функция создается как объект и присваивается переменной fib. Если функция return не вызывается в явном виде, функция возвращает значение последней выполненной команды.

Функция print.table выводит массив, полученный в результате применения функции fib к массиву чисел от 1 до 16, как таблицу, т.е. в одну строку. Использование функции print вывело бы элементы массива по одному на строку.

fib <- function(n) {
  if (n < 2)
    n
  else
    fib(n - 1) + fib(n - 2)
}

print.table(lapply(1:16, fib))

Пример для версий MIPS32

Эмулятор MARS. Вывод консоли MARS:

      The Fibonacci numbers are:
      1 1 2 3 5 8 13 21 34 55 89 144 
      -- program is finished running --

Программа выводит 15 чисел Фибоначчи. Количество чисел можно изменить в секции .data.

.data

  space:.asciiz  " "      
  head: .asciiz  "The Fibonacci numbers are:\n"
  fib: .word   0 : 15    
  size: .word  15  
       
.text

main:
  la   $t0, fib   
  la   $t5, size    
  lw   $t5, 0($t5)  
  li   $t2, 1       
  add.d $f0, $f2, $f4
  sw   $t2, 0($t0)  
  sw   $t2, 4($t0)  
  addi $t1, $t5, -2    
   
loop: 
  lw   $t3, 0($t0)   
  lw   $t4, 4($t0)  
  add  $t2, $t3, $t4    
  sw   $t2, 8($t0)  
  addi $t0, $t0, 4  
  addi $t1, $t1, -1     
  bgtz $t1, loop    
  la   $a0, fib    
  move $a1, $t5
  jal  print    
  li   $v0, 10      
  syscall  
       
print:
  add  $t0, $zero, $a0  
  add  $t1, $zero, $a1  
  la   $a0, head    
  li   $v0, 4       
  syscall       
      
out:  
  lw   $a0, 0($t0)     
  li   $v0, 1      
  syscall       
  la   $a0, space   
  li   $v0, 4       
  syscall      
  addi $t0, $t0, 4  
  addi $t1, $t1, -1    
  bgtz $t1, out  
  jr   $ra     

Пример для версий E-on-Java 0.9.3

var s := [0, 1]
var res := ""
for _ in 1..16 {
  def [a, b] := s
  s := [b, a + b]
  res := res + b.toString(10) + ", "
}
println(res + "...")

Пример для версий Mathics 0.4

Этот пример использует функцию Riffle, которая в данном случае перемежает элементы массива чисел Фибоначчи копиями строки “,”.

StringJoin[Riffle[Map[ToString, Table[Fibonacci[i], {i,16}]], ", "]] <> "..."

Пример для версий Dart 1.1.1

Используется рекурсивное определение чисел Фибоначчи.

int fibonacci(int n) => n <= 2 ? 1 : fibonacci(n - 2) + fibonacci (n - 1);

main() {
  String output = "";
  for (int i = 1; i <= 16; ++i) {
    output += fibonacci(i).toString() + ", ";
  }
  print(output + "...");
}

Пример для версий Snap! 4.0

Этот пример реализует рекурсивное вычисление чисел Фибоначчи. Для ускорения работы программы ранее найденные числа записываются в “кэш” — глобальный список.

Числа Фибоначчи (рекурсивное вычисление) на Snap!
Числа Фибоначчи (рекурсивное вычисление) на Snap!

Пример для версий Rust 1.0.0-alpha.2

fn fibonacci(x: i64) -> i64 {
  if x <= 2 {
    1
  } else {
    fibonacci(x - 1) + fibonacci(x - 2)
  }
}

fn main() {
  for i in 1..17 {
    print!("{}, ", fibonacci(i));
  }
  println!("...");
}

Пример для версий Vala 0.30

void fibonacci(){
    long output = 1;
    while(true){
        print(@"$output \n");
        output += output;
    }
}

Пример для версий Windows PowerShell 5.0

function Get-Fibonacci ($n) {
    if ($n -le 1) {
        return 1
    }
    return (Get-Fibonacci ($n - 1)) + (Get-Fibonacci ($n - 2))
}
$output = ""
foreach ($i in 0..15) {
    $output += ("{0}, " -f (Get-Fibonacci $i))
}
echo "$output..."

Пример для версий Microsoft SQL Server 2005, Microsoft SQL Server 2008 R2, Microsoft SQL Server 2012

Используется возможность рекурсивных запросов. Кол-во членов ряда — 92

declare @max_n tinyint = 92
;with t as (
	select n = 1, fib = convert(bigint,1), xfib = convert(bigint,0)
	 union all		  
	select n = n+1, fib = fib+xfib, xfib = fib from t 
        where n < @max_n
)
select fib from t

Пример для версий Clarion C10

использование 64-битной арифметики

  PROGRAM

OMIT('***')
 * User: Shur
 * Date: 29.02.2016
 * Time: 21:18
 ***

  MAP
      include('i64.inc')
ShowINT64  PROCEDURE(*INT64 a),STRING
  END

a                    LIKE(INT64)
b                    LIKE(INT64)
c                    LIKE(INT64)
str1                 CSTRING(32000)
str2                 CSTRING(32000)

   CODE
      a.lo = 1
      str1 = '1=' & ShowINT64(a)         
      b.lo = 1
      str1 = str1 & '|2=' & ShowINT64(b) 
      str2 ='1, 1'
      loop i# = 3 to 200 
         i64Add(a,b,c)
         if i64Sign(c) = -1
            break
         end   
         a :=: b ! deep assignment uses for structures
         b = c   ! usual assignment can be also used     
         str1 = str1 & '|' & i# & '=' & ShowINT64(c)         
         str2 = str2 & ', ' & ShowINT64(c)         
      end
      message(str2,'Fibonacci',,,,10b)
      message(str1,'Fibonacci',,,,10b)
            
ShowINT64           PROCEDURE(a)
d DECIMAL(30,0)
   CODE
      i64ToDecimal(d,a)
      return(d)

Работа программистам