Asosiy qismga o‘tish

7. Rekursiya

Nazariya

Fikr

Rekursiya — masalani o‘ziga o‘xshash kichikrog‘iga keltirish.
Ikki qismdan iborat:

  1. Baza — eng kichik holat, javobi to‘g‘ridan-to‘g‘ri ma’lum;
  2. Qadam — kattaroq holatni kichikrog‘i orqali ifodalash.
def fakt(n):
    if n <= 1:        # baza
        return 1
    return n * fakt(n - 1)      # qadam

Bazasiz rekursiya — cheksiz chaqiruv va RecursionError.

Chuqurlik chegarasi

Python sukut bo‘yicha ~1000 chuqurlikda to‘xtaydi. Musobaqada kerak
bo‘lsa:

import sys
sys.setrecursionlimit(300000)

Lekin chuqurlik 10⁵ dan oshsa, siklga o‘tgan ma’qul — rekursiya
xotirani ham ko‘p yeydi.

Rekursiyaning tuzog‘i

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

Bu eksponensial: fib(40) uchun ~10⁹ chaqiruv. Sabab — bir xil
qiymat qayta-qayta hisoblanadi. Yechim: natijani eslab qolish
(memoizatsiya) yoki sikl.

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n <= 2:
        return 1
    return fib(n - 1) + fib(n - 2)

Bitta qator qo‘shildi — murakkablik O(2ⁿ) dan O(n) ga tushdi. Bu
dinamik dasturlashga birinchi qadam.

Qayerda tabiiy

Daraxt va grafni aylanish, bo‘lib tashlash (merge sort), barcha
variantlarni ko‘rib chiqish (backtracking) — bularda rekursiya
sikldan ancha o‘qilishli.

Misol

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n <= 2:
        return 1
    return fib(n - 1) + fib(n - 2)

print(fib(int(input())))

Mashq masalalari

Nazorat savollari

1 Rekursiv funksiyada nima bo‘lishi shart? Bitta to‘g‘ri javob
2 Nima chiqadi? Kod nima chiqaradi
def f(n):
    if n <= 1:
        return 1
    return n * f(n - 1)

print(f(5))
3 Oddiy rekursiv `fib(n)` ning murakkabligi qanday? Bitta to‘g‘ri javob
4 `@lru_cache` nima qiladi? Bitta to‘g‘ri javob
5 Python‘da rekursiya chuqurligi sukut bo‘yicha cheklangan. To‘g‘ri yoki noto‘g‘ri
6 Chuqurlik chegarasini oshirish uchun bo‘sh joyga nima yoziladi? Bo‘sh joyni to‘ldirish
import sys
sys.____(300000)
7 Rekursiya qaysi masalalarda tabiiy? Bir nechta to‘g‘ri javob

Bir nechta javob to‘g‘ri bo‘lishi mumkin.

8 Rekursiya juda chuqur ketsa sudya qanday natija beradi? Qisqa javob — yoziladi
9 Bu funksiya `f(3)` uchun necha marta chaqiriladi (o‘zini qo‘shib)? Kod nima chiqaradi
def f(n):
    if n <= 1:
        return 1
    return f(n - 1) + f(n - 2)
10 Memoizatsiya qo‘shilgan rekursiv Fibonachchi O(n) ishlaydi. To‘g‘ri yoki noto‘g‘ri

Javoblar serverda tekshiriladi. Katta-kichik harf, apostrof shakli va ortiqcha bo‘shliq ahamiyatsiz.