Belajar PHP Part 32 : Recursive Function
- Recursive function adalah kemampuan function memanggil function dirinya sendiri
- Kadang Memang ada banyak problem, yang lebih mudah diselesaikan menggunakan recursive function, seperti contohnya kasus factorial, contoh(5 x 4 x 3 x 2 x 1)
Factorial Loop
function factorialLoop(int $value) : int {$total = 1;for ($i = 1; $i <= $value; $i++) {$total *= $i;}return $total;}var_dump(factorialLoop(5));atauvar_dump(1 * 2 *3 * 4 * 5);
Factorial Recrusive
function factorialRecursive(int $value): int{if ($value == 1){return 1;} else {return $value * factorialRecursive($value - 1);}}var_dump(factorialRecursive(5));
Problem dengan Recursive
- Walaupun recursive function itu sangat menarik, namun kita perlu berhati-hati
- Jika recursive terlalu dalam, maka akan ada kemungkinan terjadi memory overflow, yaitu error dimana memory terlalu banyak digunakan di PHP
- Kenapa problem ini bisa terjadi ? Karena ketika kita memanggil function, PHP akan menyimpannya dalam stack, jika function tersebut memanggil function lain, maka stack akan menumpuk terus, dan jika terlalu banyak, maka akan membutuhkan konsumsi memory besar, jika sudah melewati batas, maka akan terjadi error memory.
Error StackOverflow
function loop (int $value) {
if ($value == 0) {
echo "End loop" . PHP_EOL;
} else {
echo "Loop-$value" . PHP_EOL;
loop($value - 1);
}
}
loop(3000000);
Mungkin ketika melakukan loop sebanyak 10 masih tetap normal, akan tetapi jika loop nya 3 juta ini akan menjadi masalah pada recursive function.
Karena pengguna memory untuk PHP sudah ada settingan nya, jika melebihi sampai ambang batas otomatis akan berhenti/ error.
Contoh saya mencoba menjalankan 3 juta loop, 3.000.000 (total loop) - 333.203(sisa loop) = 2.666.797 (loop berhasil run)