Розв'язник вправ по дискретній математиці/Комбінаторика/Вправи на рекурсію

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Розв'язник вправ по дискретній математиці. Комбінаторика. Вправи на рекурсію

Рекурентним співвідношенням називається вираз, який дозволяє визначити наступні члени послідовності через попередні.

Під розв'язанням рекурентного співвідношення будемо розуміти формулу, яка дозволяє отримати елемент послідовності, що задається рекурсією, по його номеру, без обчислення попередніх елементів.

Наприклад, послідовність Фібоначчі:

an+1=an+an-1, a1=1, a2=1,

має розв'язком формулу Біне:

Fn=ϕn(ϕ)nϕ(ϕ)1=(1+52)n(152)n5ϕn5(n1).

Де золотий перетин ϕ=1+521,618.

Лінійне однорідне рекурентне співвідношення з постійними коефіцієнтами

Лінійним однорідним рекурентним співвідношенням з постійними коефіцієнтами порядку k є рівняння

an=c1an1+c2an2++cdand,

де всі коефіцієнти ci постійні.

Ті ж самі коефіцієнти визначають характеристичний многочлен (або "допоміжний многочлен")

p(t)=tdc1td1c2td2cd.

Згідно з основною теоремою алгебри існує d коренів рівняння p(t)=0. Ці корені відіграють вирішальну роль в знаходженні послідовності, яка відповідає заданому рекурентному співвідношенню.

Якщо всі корені r1,r2,,rd різні, то розв'язок рекурсії має вигляд:

an=k1r1n+k2r2n++kdrdn,

де коефіцієнти ki визначаються в залежності від значень початкових елементів послідовності a1,a2,,ad.

У випадку коли однакові корені присутні декілька разів (кратні корені) розв'язок рекурсії має інший вигляд. Якщо ri (i=1,,s) корінь кратності li (для простого кореня li=1), тоді

an=i=1s(ki1+ki2n++kilinli1)rin,

де коефіцієнти kij визначаються з початкових елементів послідовності.

Алгоритм розв'язання однорідного рекурентного співвідношення

1. Скласти характеристичний поліном і розв'язати його. Виписати формулу an елемента послідовності в залежності від того чи наявні кратні корені.

2. Застосувати формулу для an елемента, до початкових елементів a1,a2, значення яких вже відомі. Таким чином буде отримана система лінійних рівнянь. Розв'язок лінійної системи дозволяє знайти остаточний вираз для an.

В якості прикладу можна зауважити, що послідовність Фібоначчі задається лінійним однорідним рекурентним співвідношенням з постійними коефіцієнтами порядку два. Застосування наведеного методу дає згадану вище формулу Біне.

Приклад розв'язання однорідного рекурентного співвідношення

Нехай an+2=5an+16an, початкові значення a1=5,a2=7. Знайти формулу для обчислення an.

1. Складаємо характеристичний поліном за допомогою наступної підстановки:

an+2t2an+1t1=tant0=1

Тоді, з an+2=5an+16an отримуємо t2=5t6.

Знаходимо корені t25t+6=0: t1=2,t2=3.

Так як корені різні, то тоді розв'язок рекурсії має вигляд:

an=k1t1n+k2t2n=k1*2n+k2*3n

2. Знайдемо невідомі коефіцієнти k1,k2. Для цього застосуємо формулу для an=k1*2n+k2*3n, до початкових елементів a1=5,a2=7, значення яких вже відомі з умови. Таким чином отримаємо систему лінійних рівнянь:

{a1=k1*21+k2*31=5a2=k1*22+k2*32=7
{2k1+3k2=54k1+9k2=7

Розв'язок цієї лінійної системи k1=4,k2=1. Остаточний вираз для an=4*2n3n.

Приклад розв'язання однорідного рекурентного співвідношення з комплексними числами

Нехай an2an1+5an2=0, початкові значення a0=4,a1=4. Знайти формулу для обчислення an

1. Нехай pn розв'язок даного рівняння і an= pn. Тоді, рівняння an2an1+5an2=0 матиме вигляд

pn2pn1+5pn2=0.

Далі, розділимо отримане рівняння на pn2:

p22p+5=0.

Знайдемо його корені: p1=1+2i;p2=12i Тоді, запишемо формулу для an:

an=k1*p1+k2*p2=k1(1+2i)+k2(12i)

2. Знайдемо коєфіцієнти k1 і k2 Для цього застосуємо формулу

an=k1*p1+k2*p2=k1(1+2i)+k2(12i)

до даних елементів a0=4,a1=4. Отримаємо систему лінійних рівнянь:

{a0=k1+k2=4a1=k1*(1+2i)+k2*(12i)=4

Розв'язок цієї лінійної системи: k1=2,k2=2 Остаточний вигляд для an=2*(1+2i)n+2*(12i)n

Приклад розв'язання однорідного рекурентного співвідношення з кратними коренями

Нехай an=4an14an2, початкові значення a1=2,a2=4. Знайти формулу для обчислення an.

1. Нехай rn розв'язок даного рівняння і an=rn. Тоді, рівняння an=4an14an2 матиме вигляд

rn=4rn14rn2.

Далі, розділимо отримане рівняння на rn2: r2=4r4. Отримали квадратне рівняння: r24r+4=0 Знайдемо його корені:

r=r1=r2=2

Так як корені r1 та r2 збігаються, тоді формула для an має такий вигляд:

an=rn(k1+k2*n)

2. Знайдемо коєфіцієнти k1 і k2 Для цього застосуємо формулу an=rn(k1+k2*n) до даних елементів a1=2,a2=4. Отримаємо систему лінійних рівнянь:

{a1=2*(k1+k2)=2a2=22*(k1+k2*2)=4

Розв'язок цієї лінійної системи: k1=3,k2=2 Остаточний вигляд для an=2n*(32*n)

Алгоритм розв'язання неоднорідного рекурентного співвідношення

1. Знайти частковий розв'язок неоднорідного рекурентного співвідношення anc. Це якраз найскладніше завдання, тому що не існує єдиного алгоритму дій на цьому етапі.

2. Знайти розв'язок однорідного рекурентного співвідношення ano у загальному вигляді. Невідомі коефіцієнти будуть обчислені на наступному кроці.

3. Розв'язок неоднорідного рекурентного співвідношення записати у вигляді an=ano+anc. Застосувати формулу для an елемента, до початкових елементів a1,a2, значення яких вже відомі. Таким чином буде отримана система лінійних рівнянь. Розв'язок лінійної системи дозволяє знайти остаточний вираз для an.

Приклад розв'язання неоднорідного рекурентного співвідношення

Нехай an+24an+1+3an=2n, початкові значення a0=7,a1=10. Знайти формулу для обчислення an.

1. Знайдемо частковий розв'язок неоднорідного рекурентного співвідношення у вигляді anc=A2n, де A — константа, яка буде знайдена. Тоді an+1c=A2n+1=2A2n, an+2c=A2n+2=4A2n. Підставимо у рекурентне рівняння:

4A2n42A2n+3A2n=2n
4A8A+3A=1
A=1

Отже, частковим розв'язком неоднорідного рекурентного співвідношення буде anc=2n

2. Знайдемо розв'язок ano однорідного рекурентного співвідношення an+24an+1+3an=0 у загальному вигляді. Невідомі коефіцієнти будуть обчислені на наступному кроці.

an+2t2an+1t1=tant0=1
t24t+3=0.

Знаходимо корені: t1=1,t2=3.

Так як корені різні, то тоді розв'язок рекурсії має вигляд:

an=k1t1n+k2t2n=k1+k2*3n

3. Розв'язком неоднорідного рекурентного співвідношення буде an=ano+anc=k1+k2*3n2n. Знайдемо невідомі коефіцієнти k1,k2. Для цього застосуємо формулу для an=k1+k2*3n2n до початкових елементів a0=7,a1=10, значення яких вже відомі з умови. Таким чином отримаємо систему лінійних рівнянь:

{a0=k1+k2*3020=7a1=k1+k2*3121=10
{k1+k21=7k1+3k22=10

Розв'язок цієї лінійної системи k1=6,k2=2. Остаточний вираз для an=6+2*3n2n.

Додаткові вправи

Розв'яжіть рекурентні співвідношення:

  • an+25an+1+4an=0, початкові значення a0=3,a1=9.
  • an+26an+1+9an=0, початкові значення a0=1,a1=9.
  • an+2+4an=0, початкові значення a0=1,a1=2.
  • an+23an+1+2an=124n, початкові значення a0=1,a1=9. Відповідь: an=2n+1+24n3.
  • an+2+3an+110an=83n, початкові значення a0=3,a1=0. Відповідь: an=(5)n+2n+3n.
  • an+3an+28an+1+12an=0, знайдіть загальний розв'язок. Відповідь: an=2n(C1+nC2)+(3)nC3.
  • Нехай an вектор довжини n, який складається з нулів та одиниць. а) Скільки існує таких векторів? б) Скільки існує таких векторів, де нулі не стоять поруч? с) Скільки векторів у яких будь-які два сусідні елемента різні?

Написати програму

Задача 1

Рекурсивного обчислення n!.

Задача 2

Рекурсивного обчислення чисел Фібоначчі.

Задача 3

Розв'язати завдання з leetcode.com (Count Vowels Permutation). Given an integer n, your task is to count how many strings of length n can be formed under the following rules:

  • Each character is a lower case vowel ('a', 'e', 'i', 'o', 'u')
  • Each vowel 'a' may only be followed by an 'e'.
  • Each vowel 'e' may only be followed by an 'a' or an 'i'.
  • Each vowel 'i' may not be followed by another 'i'.
  • Each vowel 'o' may only be followed by an 'i' or a 'u'.
  • Each vowel 'u' may only be followed by an 'a'.

Since the answer may be too large, return it modulo 10^9 + 7.

Шаблон:Hider

Шаблон:Hider