GNU/Linux >> Belajar Linux >  >> Linux

Tutorial Pemrograman Linux C Bagian 18:Fungsi rekursif

Terlepas dari bahasa pemrograman yang Anda gunakan, saat Anda mulai coding lebih dan lebih, Anda bisa mempelajari konsep-konsep yang membuat kode Anda tajam dan mudah dibaca/dipahami. Ada beberapa konsep seperti itu di C juga. Salah satunya adalah 'fungsi rekursif', yang akan kita bahas di artikel ini.

Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Pemanggilan dapat dilakukan langsung dari dalam tubuh fungsi, atau secara tidak langsung dari dalam beberapa fungsi lain yang dipanggil oleh fungsi yang bersangkutan.

Berikut ini adalah contoh rekursi langsung:

int func (int a)
{
//statements

func(a-1);

// statements

return 0;
}

Dan inilah contoh rekursi tidak langsung:

int func (int a)
{
//statements

func_new(a);

// statements

return 0;
}

int func_new(int b)
{
//statements

func(b-1);

//statementsur

return 0;
}

Seperti yang telah disebutkan di awal, rekursi membantu Anda mencapai kode ringkas, yang tidak hanya mudah ditulis tetapi juga mudah dipahami dan ditinjau. Mari kita ambil contoh untuk memperjelas keunggulan ini.

Saya yakin Anda semua pasti pernah mendengar tentang konsep faktorial. Bagi mereka yang tidak tahu, faktorial adalah hasil yang Anda dapatkan ketika Anda mengalikan sebuah bilangan bulat dengan semua bilangan bulat positif yang lebih kecil darinya. Misalnya, faktorial dari 5 adalah 5x4x3x2x1, yang sama dengan 120.

Berikut kode sederhana untuk mencari faktorial suatu bilangan:

#include <stdio.h>

int main()
{
int a = 0, i = 0, fact = 1;
printf("Enter a number: ");

scanf("%d", &a);

for(i=1; i<=a; i++)
{
fact = fact * i;

}
printf("Factorial of the number is: %d ", fact);
return 0;
}

Perhatikan bahwa kode ini hanya untuk memberi tahu Anda bagaimana faktorial suatu bilangan dapat dihitung melalui program C. Program tidak menangani kasus sudut yang dapat mempengaruhi keakuratan hasil yang dihasilkannya.

Jadi ini adalah salah satu dari banyak cara di mana Anda dapat menghitung faktorial suatu bilangan tanpa menggunakan fungsi rekursif. Sekarang mari kita lihat sepotong kode yang menggunakan rekursi untuk menghitung faktorial.

#include <stdio.h>

int factorial (int b)
{
if(!b)
return 1;

return (b * factorial(b-1));
}

int main()
{
int a = 0, fact = 1;
printf("Enter a number: ");

scanf("%d", &a);

fact = factorial(a);

printf("Factorial of the number is: %d ", fact);
return 0;
}

Jadi Anda bisa lihat, fungsi 'faktorial' yang sebenarnya menghitung faktorial sangat kompak. Dan jika Anda perhatikan dengan seksama, ini juga sangat mudah dipahami.

Bagi mereka yang tidak tahu apa yang terjadi, nilai yang dimasukkan pengguna, katakanlah 5, diteruskan ke fungsi 'faktorial' saat pertama kali dipanggil dari dalam fungsi 'utama'. Di dalam fungsi 'faktorial', ada pemeriksaan untuk melihat apakah nilai inputnya nol, yang mana tidak benar ketika fungsi dipanggil pertama kali dengan nilai input '5'.

Kemudian, pernyataan pengembalian berisi ekspresi yang mengalikan 5 dengan nilai kembalian 'faktorial(4)'. Jadi sekarang, fungsi 'faktorial' dijalankan sekali lagi, dan kita mencapai ekspresi berikut:return (4 * faktorial(3)). Dan sekali lagi langkah-langkah ini diulangi.

Jadi jika Anda melihat secara luas, beginilah cara panggilan fungsi ini ditumpuk:

  • 5 * faktorial(4)
  • 4 * faktorial(3)
  • 3 * faktorial(2)
  • 2 * faktorial (1)
  • 1 * faktorial (0)

Sekarang ketika faktorial(0) dijalankan, kondisi 'jika' dalam fungsi 'faktorial' menjadi benar, dan nilai '1' dikembalikan. Jadi sekarang, beginilah cara menyelesaikan panggilan yang tercantum di atas (bandingkan entri terakhir dalam daftar sebelumnya dengan entri pertama dalam daftar ini, dan seterusnya):

  • 1 * 1
  • 2 * (1*1)
  • 3 * (2*(1*1))
  • 4 * (3*(2*(1*1))))
  • 5 *  (4 * (3*(2*(1*1)))))

Yang secara efektif 5 * 4 *3 * 2 * 1, yang pada gilirannya adalah 120, faktorial dari 5.

Jadi beginilah cara kerja fungsi rekursif. Meskipun tidak ada keraguan tentang keunggulan fungsi rekursif yang kami sebutkan sejauh ini, ada juga beberapa kelemahannya.

Misalnya, dalam contoh kita di atas, hingga panggilan 'faktorial(0)' selesai, semua panggilan 'faktorial' sebelumnya menunggu pemrosesan fungsi selesai. Belum lagi fakta bahwa variabel otomatis atau lokal menempati memori untuk setiap panggilan rekursif yang dibuat.

Jadi secara efektif tidak ada penghematan dalam ruang penyimpanan saat Anda menggunakan rekursi. Plus, tidak ada jaminan bahwa kode Anda akan lebih cepat dalam eksekusi. Keuntungan sebenarnya dari fungsi rekursif adalah ketika Anda berurusan dengan struktur data, yang akan dibahas nanti sebagai bagian dari seri tutorial C yang sedang berlangsung ini.

Kesimpulan

Sebagai kesimpulan, meskipun Anda mungkin tidak sering menggunakan fungsi rekursif dalam tugas pengkodean sehari-hari, ini adalah konsep penting yang harus Anda ketahui. Cobalah contoh yang telah kami sebutkan di sini, dan sesuaikan untuk memahami konsep fungsi rekursif dengan lebih baik.


Linux
  1. Tutorial Pemrograman C Bagian 5 - Variabel karakter

  2. Tutorial Pemrograman Linux C Bagian 10 - Lingkup Variabel

  3. Tutorial Pemrograman Linux C Bagian 9 :String

  1. Tutorial Pemrograman Linux C Bagian 8 - Call by Value Vs Call by Pointer/Alamat

  2. Tutorial Pemrograman Linux C Bagian 8 - Call by Value Vs Call by Pointer/Alamat

  3. Tutorial Pemrograman Linux C Bagian 8 - Call by Value Vs Call by Pointer/Alamat

  1. Tutorial Pemrograman Linux C Bagian 14 - Contoh praktis operator Bitwise

  2. Tutorial Pemrograman Linux C Bagian 12 - Operator Penugasan dan Ekspresi Bersyarat

  3. Tutorial Pemrograman Linux C Part 11 - Operator Aritmatika, Relasional, dan Logika