Rekursi ialah teknik di mana fungsi memanggil dirinya sendiri. Ia adalah corak pengaturcaraan yang membahagikan masalah itu kepada yang lebih kecil untuk menyelesaikan masalah yang lebih besar. Menggunakan rekursi dalam JavaScript kita boleh melakukan perkara seperti gelung atau lelaran, tetapi rekursi boleh menjadi lebih mudah dan lebih telus untuk menyelesaikan beberapa masalah.
Bagaimanakah rekursi berfungsi?
Rekursi mempunyai dua bahagian utama:
-
Kes Asas: Ini ialah keadaan di mana fungsi tidak akan memanggil dirinya sendiri lagi. Ia bertindak sebagai titik perhentian untuk fungsi rekursif. Fungsi rekursif tanpa kes asas kadangkala boleh menyebabkan limpahan tindanan (iaitu, kehabisan memori disebabkan panggilan berulang ke fungsi tersebut).
-
Kes Rekursif: Ini ialah bahagian di mana fungsi memanggil dirinya sendiri, cuba menyelesaikan masalah dengan memecahkannya kepada bahagian yang lebih kecil.
cth:
-
Pengiraan faktor: Faktorial ialah jumlah hasil darab semua nombor daripada nombor hingga 1. Contohnya, n!=n×(n−1)×(n−2)×...×1 5! = 5 * 4 * 3 * 2 * 1 = 120.
Faktorial ialah hasil darab semua integer positif daripada nombor itu hingga 1.
function factorial(n) {
// Base case: n যদি 1 হয়, তাহলে 1 রিটার্ন করো
if (n === 1) {
return 1;
}
// Recursive case: n * factorial(n-1)
return n * factorial(n - 1);
}
console.log(factorial(5)); // Output: 120
Salin selepas log masuk
Di sini, fungsi faktorial memanggil dirinya sendiri sehingga n menjadi 1. Apabila n ialah 1, fungsi itu tidak lagi memanggil dirinya sendiri dan mengembalikan 1. Keputusan ini dikembalikan secara beransur-ansur melalui panggilan sebelumnya dan panggilan asal mengembalikan 120 sebagai hasil akhir.
Apabila faktorial(5) dipanggil, ia akan mula memanggil 5 * faktorial(4) dan seterusnya sehingga faktorial(0) di mana keadaan kes asas dipenuhi.
-
Siri Fibonacci: Siri Fibonacci ialah contoh yang terkenal di mana setiap nombor ialah jumlah dua nombor sebelumnya. F(n)=F(n−1)+F(n−2)
Siri Fibonacci ialah siri nombor di mana dua nombor pertama ialah 0 dan 1, dan setiap nombor berikutnya ialah hasil tambah dua nombor sebelumnya. Contohnya, 0, 1, 1, 2, 3, 5, 8, …
function fibonacci(n) {
// Base cases: n যদি 0 বা 1 হয়, সরাসরি n রিটার্ন করো
if (n === 0 || n === 1) {
return n;
}
// Recursive case: fibonacci(n-1) + fibonacci(n-2)
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(6)); // Output: 8
Salin selepas log masuk
Penjelasan:
-
Kes Asas: Jika nilai n ialah 0, fibonacci(0) mengembalikan 0. Jika nilai n ialah 1, fibonacci(1) mengembalikan 1.
-
Kes Rekursif: Dalam mana-mana kes lain, fibonacci(n) akan memanggil dirinya dengan n−1 dan n−2 dan mengembalikan jumlahnya.
Jawapan Penjelasan:
-
fibonacci(0) = 0
-
fibonacci(1) = 1
-
fibonacci(2) = fibonacci(1) + fibonacci(0) = 1 + 0 = 1
-
fibonacci(3) = fibonacci(2) + fibonacci(1) = 1 + 1 = 2
-
fibonacci(4) = fibonacci(3) + fibonacci(2) = 2 + 1 = 3
-
fibonacci(5) = fibonacci(4) + fibonacci(3) = 3 + 2 = 5
-
fibonacci(6) = fibonacci(5) + fibonacci(4) = 5 + 3 = 8
এভাবে fibonacci(6) এর মান দাঁড়ায় 8, যা 6-তম ফিবোনাচি সংখ্যা।
-
Tree Traversal: Tree ডেটা স্ট্রাকচারে একটি Recursive Function ব্যবহার করে DFS (Depth-First Search) করা যেতে পারে।
javascriptCopy code
function traverseTree(node) {
console.log(node.value);
node.children.forEach(child => traverseTree(child));
}
const tree = {
value: 1,
children: [
{ value: 2, children: [] },
{ value: 3, children: [
{ value: 4, children: [] },
{ value: 5, children: [] }
] }
]
};
traverseTree(tree);
// Output:
// 1
// 2
// 3
// 4
// 5
Salin selepas log masuk
Recursion এর উপকারিতা এবং অসুবিধা
- উপকারিতা
-
কোড সরলতা: Recursion জটিল সমস্যাকে সহজভাবে প্রকাশ করতে সাহায্য করে, বিশেষ করে এমন সমস্যা যেখানে সমস্যাগুলি নিজের অনুরূপ।
-
কোড পুনরাবৃত্তি: Recursion প্রায়শই কোডের পুনরাবৃত্তি দূর করে এবং সমাধানগুলোকে ছোট এবং পরিষ্কার করে।
-
কিছু নির্দিষ্ট সমস্যা সমাধানে কার্যকর: যেমন Tree এবং Graph ডেটা স্ট্রাকচার traversal, অথবা Mathematical series এবং sequences।
- অসুবিধা
-
পারফরম্যান্স: প্রত্যেকটি recursive কল একটি নতুন execution context তৈরি করে, যা stack memory তে সংরক্ষণ করা হয়। অতিরিক্ত recursion এর ফলে stack overflow এর ঝুঁকি থাকে।
-
জটিলতা: সাধারণ লুপের তুলনায় কিছু ক্ষেত্রে recursion বোঝা কঠিন হতে পারে, বিশেষ করে শুরুতে।
-
অকার্যকর ফাংশন: কিছু ক্ষেত্রে, recursion অকার্যকর হতে পারে, যদি recursive ফাংশনের প্রতিটি কলের ফলে অনেক অপ্রয়োজনীয় গণনা হয়। এক্ষেত্রে Memoization বা Iterative পদ্ধতির ব্যবহার অধিক কার্যকরী।
Atas ialah kandungan terperinci Perbincangan terperinci tentang Rekursi dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!