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).

 

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

 

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)

 

Related Articles

 

Comments

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

[…] Silahkan melanjutkan membaca pembahasan PL/SQL Subprograms […]

[…] 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. […]

[…] Dynamic SQLPL/SQL Object TypesPL/SQL PackagesPL/SQL SubprogramsInteraksi PL/SQL dengan […]

Leave a comment

(required)

(required)


*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word