7-bo'lim: Rekursiya¶
π§ Rekursiyada xotira odatda chaqiruv steki (call stack) chuqurligiga teng. Juda chuqur rekursiya stack overflow beradi β Pythonda standart limit ~1000.
92. Yig'indi 1..n (rekursiv)¶
β± O(n) Β· πΎ O(n) β stek chuqurligi.
JS
PHP Python93. Massiv yig'indisi (rekursiv)¶
β± O(n) Β· πΎ O(n)
Eslatma: indeks orqali β slicing (arr[1:]) ishlatilsa har chaqiruvda O(n) nusxa olinib, jami O(nΒ²) bo'lardi.
JS
PHP Python94. Daraja (rekursiv power) base^exp¶
β± O(e) Β· πΎ O(e)
Eslatma: tez darajalash (b^(e/2) ni kvadratga ko'tarish) bilan O(log e) ga tushadi.
JS
PHP Python95. Fibonachchi (rekursiv, n-element)¶
β± O(2βΏ) Β· πΎ O(n)
Eslatma: sodda rekursiya eksponensial β bitta qiymat qayta-qayta hisoblanadi. Memoizatsiya (DP) bilan O(n) bo'ladi (14-bo'lim).
JS
PHP PythonQuyidagi chaqiruv daraxti nega sodda rekursiya eksponensial ekanini ko'rsatadi β bir xil qiymatlar (masalan fib(3), fib(2)) qayta-qayta hisoblanadi:
96. Satrni teskari (rekursiv)¶
β± O(n) Β· πΎ O(n)
JS
PHP Python97. Raqamlar yig'indisi (rekursiv)¶
β± O(d) Β· πΎ O(d) β d: raqamlar soni.
JS
PHP Python98. Palindrom (rekursiv tekshirish)¶
β± O(n) Β· πΎ O(n)
JS
const isPalindrome = s =>
s.length <= 1 ? true : s[0] === s[s.length - 1] && isPalindrome(s.slice(1, -1));
function isPalindrome($s) {
if (strlen($s) <= 1) return true;
return $s[0] === $s[strlen($s) - 1] && isPalindrome(substr($s, 1, -1));
}
99. Massivda chiziqli qidiruv (rekursiv)¶
β± O(n) Β· πΎ O(n) β topilsa indeks, aks holda β1.
JS
PHPfunction search($arr, $x, $i = 0) {
if ($i === count($arr)) return -1;
return $arr[$i] === $x ? $i : search($arr, $x, $i + 1);
}
def search(arr, x, i=0):
if i == len(arr):
return -1
return i if arr[i] == x else search(arr, x, i + 1)
100. Massivdagi eng katta (rekursiv)¶
β± O(n) Β· πΎ O(n)
JS
PHPfunction maxOf($arr, $i = 0) {
if ($i === count($arr) - 1) return $arr[$i];
return max($arr[$i], maxOf($arr, $i + 1));
}
101. Hanoy minorasi (Tower of Hanoi)¶
β± O(2βΏ) Β· πΎ O(n) β harakatlar ketma-ketligini qaytaradi.
JS
const hanoi = (n, from = "A", to = "C", via = "B", moves = []) => {
if (n === 0) return moves;
hanoi(n - 1, from, via, to, moves);
moves.push(`${from} -> ${to}`);
hanoi(n - 1, via, to, from, moves);
return moves;
};
function hanoi($n, $from = "A", $to = "C", $via = "B", &$moves = []) {
if ($n === 0) return $moves;
hanoi($n - 1, $from, $via, $to, $moves);
$moves[] = "$from -> $to";
hanoi($n - 1, $via, $to, $from, $moves);
return $moves;
}
def hanoi(n, frm="A", to="C", via="B", moves=None):
if moves is None:
moves = []
if n == 0:
return moves
hanoi(n - 1, frm, via, to, moves)
moves.append(f"{frm} -> {to}")
hanoi(n - 1, via, to, frm, moves)
return moves
102. Barcha permutatsiyalar (permutations)¶
β± O(n Β· n!) Β· πΎ O(n Β· n!)
Eslatma: amaliyotda Pythonda itertools.permutations ishlatiladi.
JS
const permutations = arr => {
if (arr.length <= 1) return [arr];
return arr.flatMap((x, i) =>
permutations([...arr.slice(0, i), ...arr.slice(i + 1)]).map(p => [x, ...p]));
};
function permutations($arr) {
if (count($arr) <= 1) return [$arr];
$result = [];
foreach ($arr as $i => $x) {
$rest = array_merge(array_slice($arr, 0, $i), array_slice($arr, $i + 1));
foreach (permutations($rest) as $p) {
array_unshift($p, $x);
$result[] = $p;
}
}
return $result;
}
def permutations(arr):
if len(arr) <= 1:
return [arr]
result = []
for i, x in enumerate(arr):
for p in permutations(arr[:i] + arr[i + 1:]):
result.append([x] + p)
return result
103. Quvvat to'plami (power set β barcha kichik to'plamlar)¶
β± O(2βΏ) Β· πΎ O(2βΏ)
JS
const powerSet = arr => {
if (arr.length === 0) return [[]];
const rest = powerSet(arr.slice(1));
return [...rest, ...rest.map(s => [arr[0], ...s])];
};
function powerSet($arr) {
if (count($arr) === 0) return [[]];
$first = $arr[0];
$rest = powerSet(array_slice($arr, 1));
$withFirst = array_map(fn($s) => array_merge([$first], $s), $rest);
return array_merge($rest, $withFirst);
}
def power_set(arr):
if not arr:
return [[]]
rest = power_set(arr[1:])
return rest + [[arr[0]] + s for s in rest]
104. O'nlikni ikkilikka (rekursiv)¶
β± O(log n) Β· πΎ O(log n)
JS
PHP Python