Tutaq ki, — xət ilə düzülmüş müəllimə kartları paylama üsullarının sayıdır (bu zaman ilk və sonuncu qonşu hesab edilmir). Bu məsələ, heç bir iki ədədinin yan-yana olmadığı uzunluqları olan ikilik ardıcıllıqların sayını hesablamaqla ekvivalentdir. Həll Fibonaccinin ardıcıllığıdır ki, aşağıdakı rekursiv düsturla verilir:
Tutaq ki, — dairəvi şəkildə yerləşən müəllimə kart paylama üsullarının sayıdır.
Əgər birinci müəllimə tüz verilməyibsə, onda qalan n - 1 müəllimlərə tüzləri g(n - 1) şəkildə paylamaq olar.
Əgər birinci müəllimə tüz verilibsə, onda ikinci və sonuncu müəllimlərə tüz vermək olmaz. Bu halda qalan n - 3 müəllimlərə tüzləri g(n - 3) şəkildə paylamaq olar.
Beləliklə, aşağıdakı ifadəni alırıq:
Nümunə
n = 3 üçün bizə dəyəri lazım olacaq. Bu g(0) + g(1) = g(2) bərabərliyindən tapıla bilər, buradan isə
Beləliklə
Əsas hallar aşağıdakı kimidir:
Alqoritmin reallaşdırılması
Fibonacci ədədlərini saxlamaq üçün massivi elan edirik.
#define MAX 46
int fib[MAX];Proqramın əsas hissəsi. Fibonacci ədədlərini hesablayırıq.
fib[0] = 1; fib[1] = 2;
for (int i = 2; i < MAX; i++)
fib[i] = fib[i - 1] + fib[i - 2];Girişdə olan ədədini oxuyuruq.
scanf("%d", &n);Cavab -i hesablayırıq.
if (n == 1) res = 2; else
if (n == 2) res = 3; else
res = fib[n - 1] + fib[n - 3];Cavabı çap edirik.
printf("%d\n", res);Java reallaşdırılması
import java.util.*;
public class Main
{
private static final int MAX = 46;
public static void main(String[] args)
{Fibonacci ədədlərini saxlamaq üçün massivi elan edirik.
int[] fib = new int[MAX];Fibonacci ədədlərini hesablayırıq.
fib[0] = 1;
fib[1] = 2;
for (int i = 2; i < MAX; i++)
fib[i] = fib[i - 1] + fib[i - 2];Girişdə olan ədədini oxuyuruq.
Scanner con = new Scanner(System.in);
int n = con.nextInt();Cavab -i hesablayırıq.
int res;
if (n == 1) res = 2;
else if (n == 2) res = 3;
else res = fib[n - 1] + fib[n - 3];Cavabı çap edirik.
System.out.println(res);
}
}Python reallaşdırılması
Fibonacci ədədlərini saxlamaq üçün siyahısı elan edirik.
fib = [0] * 46Fibonacci ədədlərini hesablayırıq.
fib[0] = 1
fib[1] = 2
for i in range(2, 46):
fib[i] = fib[i - 1] + fib[i - 2]Girişdə olan ədədini oxuyuruq.
n = int(input())Cavab -i hesablayırıq.
if n == 1: res = 2
elif n == 2: res = 3
else: res = fib[n - 1] + fib[n - 3]Cavabı çap edirik.
print(res)