PL/SQL Subprograms
8.19.2. Menggunakan Mutual Recursion
Subprograms adalah mutually recursive jika mereka secara langsung atau tidak langsung saling memanggil satu sama lain. Dalam contoh berikut ini, function Boolean odd dan even, yang bertugas menentukan apakah sebuah angka adalah ganjil atau genap, saling memanggil satu dengan lainnya. Deklarasi ke depan (forward declaration) dari odd diperlukan karena even memanggil odd, yang mana belum dideklarasikan ketika pemanggilan dilakukan.
FUNCTION odd (n NATURAL) RETURN BOOLEAN; -- forward declaration
FUNCTION even (n NATURAL) RETURN BOOLEAN IS
BEGIN
IF n = 0 THEN
RETURN TRUE;
ELSE
RETURN odd(n - 1); -- mutually recursive call
END IF;
END even;
FUNCTION odd (n NATURAL) RETURN BOOLEAN IS
BEGIN
IF n = 0 THEN
RETURN FALSE;
ELSE
RETURN even(n - 1); -- mutually recursive call
END IF;
END odd;
Ketika sebuah integer positif n dilewatkan kepada odd atau even, functions tersebut memanggil satu sama lain secara bergiliran. Pada setiap pemanggilan, n dikurangi. Pada akhirnya, n menjadi nol dan pemanggilan terakhir menghasilkan TRUE atau FALSE. Sebagai contoh, melewatkan nilai 4 ke odd menghasilkan urutan pemanggilan sebagai berikut:
odd(4) even(3) odd(2) even(1) odd(0) -- menghasilkan FALSE
Dengan kata lain, melewatkan angka 4 ke even menghasilkan urutan pemanggilan:
even(4) odd(3) even(2) odd(1) even(0) -- menghasilkan TRUE
8.19.3. Rekursi Versus Iterasi
Tidak seperti iterasi, rekursi tidak terlalu perlu dalam pemrogram PL/SQL. Beberapa problem yang dapat diselesaikan menggunakan rekursi dapat pula diselesaikan menggunakan iterasi. Juga, versi iteratif dari sebuah subprogram biasanya lebih mudah bagi desain dibandingkan dengan versi rekursif. Namun, versi rekursif biasanya lebih sederhana, lebih kecil, dan lebih mudah di-debug. Mari kita bandingkan function-function berikut ini, yang menghitung angka Fibonacci ke-n:
-- recursive version
FUNCTION fib (n POSITIVE) RETURN INTEGER IS
BEGIN
IF (n = 1) OR (n = 2) THEN
RETURN 1;
ELSE
RETURN fib(n - 1) + fib(n - 2);
END IF;
END fib;
-- iterative version
FUNCTION fib (n POSITIVE) RETURN INTEGER IS
pos1 INTEGER := 1;
pos2 INTEGER := 0;
accumulator INTEGER;
BEGIN
IF (n = 1) OR (n = 2) THEN
RETURN 1;
ELSE
accumulator := pos1 + pos2;
FOR i IN 3..n LOOP
pos2 := pos1;
pos1 := accumulator;
accumulator := pos1 + pos2;
END LOOP;
RETURN accumulator;
END IF;
END fib;
Versi rekursif dari fib lebih elegan dibandingkan dengan versi iteratif. Namun, versi iteratif lebih efisien; ia dapat berjalan lebh cepat dan menggunakan penyimpanan lebih sedikit. Sejalan dengan jumlah pemanggilan rekursi yang semakin membesar, sehingga hal ini menyebabkan perbedaan dalam hal efisiensi. Jadi, jika kita mengharapkan jumlah pemanggilan rekursif menjadi lebih kecil, kita dapat memilih versi rekursif untuk alasan keterbacaan (readibility).
| Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi. Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma dsb. Harga Rp. 24.800,- (157 halaman) |
Comments
[…] Klausa AUTHID menentukan apakah seluruh subprogram-subprogram ter-package dijalankan dengan privileges dari definer (default) atau invoker-nya, dan apakah referensi tak terkualifikasi dari mereka terhadap schema objects ditetapkan di dalam schema dari definer atau invoker tersebut. Untuk informasi lebih, kita dapat membaca kembali pembahasan PL/SQL Subprograms. […]


[…] PL/SQL Subprograms | Hastinapura […]