Minggu, 28 April 2013

REKURSI DAN LINKED LIST




 
#include <stdio.h>

#include <stdlib.h>

int main(void)
{
       int i; //deklarasi var i dengan tipe data int (integer)
       int faktorial (int w);
       printf("Wulan Kandiani Kusumah Wardani\n\n");
       printf("49013036\n\n");
       printf("Masukan sembarang bilangan bulat positif: ");//Menampilkan ekspresi dilayar "Masukan sembarang bulangan bulat positif"
       scanf("%d",&i);//untuk memasukan data lewat keyboard
       printf("\nMelalui perhitungan rekursif, %d!=%d\n\n",faktorial (i));//Menampilkan ekspresi dilayar "Melalui perhitungan rekursif"
       //untuk mencetak nilai dari var i dalam bentuk faktorial (%d!) dengan cara memanggil variabel i
       //var faktorial (i)
       //memasukan nilai i ke fungsi faktorial (int w)
       system ("pause");
       return 0;
}
int faktorial(int w)
{
       if (w == 0)//untuk menyeleksi suatu kondisi
              //perbandingan jika var w samadengan nol (0)
              return 1;
       else
              //var w mengembalikan nilai 1
              return w*faktorial(w-1);
              // Fungsi rekursif:
              // inputan 5 dikalikan dengan faktorial (5-1)
              // inputan 4 dikalikan dengan faktorial (4-1)
              // inputan 3 dikalikan dengan faktorial (3-1)
              // inputan 2 dikalikan dengan faktorial (2-1)
              // inputan 5 dikalikan dengan faktorial (1-1)
}

DESKRIPSI SINGKAT:


Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri, baik secara langsung maupun tidak langsung. Pemanggilan fungsi rekursif secara langsung berarti dalam fungsi tersebut terdapat perintah untuk memanggil dirinya sendiri sedangkan secara tidak langsung berarti fungsi rekursif memanggil 1 atau lebih fungsi lain sebelum memanggil dirinya sendiri.
Fungsi Rekursif akan terus berjalan sampai kondisi berhenti terpenuhi, oleh karena itu dalam sebuah fungsi rekursif perlu terdapat 2 blok penting, yaitu blok yang menjadi titik berhenti dari sebuah proses rekursi dan blok yang memanggil dirinya sendiri. Fungsi rekursif tidak selalu lebih jelek daripada iteratif. Ada kalanya sebuah fungsi rekursif justru mempermudah penyelesaian masalah yang ditemui pada kasus iteratif (pengulangan)
Meskipun penulisan dengan fungsi rekursif lebih singkat dari fungsi iteratif, tapi fungsi rekursif memiliki kelemahan, yaitu memerlukan memori yang lebih banyak, karena perlu tambahan untuk ‘Activation Record Stack’. Dengan demikian waktu proses lebih lama, karena perlu menjejaki setiap pemanggilan rekursif melalui ‘Activation Record’. Karena setiap pemanggilan fungsi, register dan memory harus di push ke stack maka setelah selesai pemanggilan perlu diadakannya pop stack. untuk mengembalikan memory dan register kembali ke keadaan awal, ini sering disebut sebagai overhead.

/*1. Pada fungsi ini "faktorial(int w)" dengan parameter "w" nilainya diisikan variable "w" dan nilai dari variable "w" didapatkan dari inputan user, misal w=6.

2. Dalam blok fungsi faktorial saat dijalankan, maka akan terdapat kondisi pengecekkan, jika w==0 maka, fungsi Faktorial, akan langsung di hentikan, jika tidak, maka akan mengembalikan nilai, w*Faktorial(w-1).

3. Alur dari return "w* faktorial(w-1)":
   // Fungsi rekursif:
   // inputan 5 dikalikan dengan faktorial (5-1)
   // inputan 4 dikalikan dengan faktorial (4-1)
   // inputan 3 dikalikan dengan faktorial (3-1)
   // inputan 2 dikalikan dengan faktorial (2-1)
   // inputan 1 dikalikan dengan faktorial (1-1)
*/