Lebih dalam ke dalam kompleksitas fungsi dengan skrip shell - Bagian VII
- 2041
- 40
- Ricardo Gottlieb
Artikel saya sebelumnya tentang “Fungsi Pemahaman dan Menulis dalam Skrip Shell” mungkin telah memberi Anda ide dasar tentang cara menulis fungsi di bawah skrip shell. Sekarang saatnya untuk mendapatkan fitur fungsional yang lebih dalam seperti penggunaan variabel lokal dan rekursi.
Fungsi kompleksitas dengan skrip shellVariabel lokal
Apa yang membuat variabel lokal? Itu tergantung pada blok tertentu di mana variabel dinyatakan. Variabel yang dinyatakan sebagai lokal akan dapat diakses dari blok kode di mana ia muncul.e. Ruang lingkupnya lokal. Untuk menjelaskan hal ini, mari kita lihat satu contoh di bawah ini.
#!/bin/bash func () lokal i = 10 j = 20 echo "i from func = $ i" echo "j from func = $ j" echo "I di luar func = $ i" echo "j luar func = $ j "func echo" I Outside func = $ i "echo" j luar func = $ j "keluar 0
Pada menjalankan skrip di atas output akan.
i Outside func = j luar func = i from func = 10 j dari func = 20 i Outside func = j luar func = 20
Ini karena fungsinya func belum menelepon saat 2 pertama pernyataan gema dieksekusi. Setelah memanggil fungsinya func sama 2 pernyataan gema menghasilkan hasil yang berbeda. Sekarang variabelnya J, yang dinyatakan di dalam func dan bukan lokal, dapat diakses setelahnya.
Dengan demikian nilai untuk J menjadi 20. Bagaimana dengan variabel lokal Saya? Karena cakupannya berada di dalam fungsi func, nilai 10 tidak dapat diakses dari luar. Perhatikan bahwa variabel tersebut J biasanya dinyatakan di dalam func adalah global secara default.
Sekarang Anda terbiasa dengan variabel lokal dan cara menggunakannya di dalam blok fungsi. Mari kita beralih ke bagian yang paling menarik di bawah fungsi, rekursi.
Apa itu rekursi?
Fungsi yang memanggil itu sendiri secara umum disebut sebagai prosedur rekursi. Atau dapat didefinisikan sebagai mengekspresikan algoritma dengan menggunakan versi yang lebih sederhana dari algoritma yang sama. Pertimbangkan contoh menemukan faktorial suatu angka. Kami tahu itu N! = 1 x 2 x 3 x… x (n-1) x n. Dengan demikian kita dapat menulis hubungan kekambuhan sebagai:
N! = (n-1)! x n
Jadi mudah bagi kami untuk secara rekursif memanggil fungsi yang sama dan menggunakan nilai pengembalian dari setiap panggilan untuk berlipat ganda dengan hasil sebelumnya, saya.e.
5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1
Rekursi menggunakan variabel lokal
Di sini kami mencoba menulis skrip untuk menemukan faktorial angka menggunakan variabel lokal dan rekursi.
#!/Bin/Bash fact () num lokal = $ 1 jika [$ num -eq 0]; Kemudian ret = 1 else temp = $ ((num-1)) fakta $ temp ret = $ ((num*$?)) fi return $ ret fakta 5 echo "faktorial 5 = $?"Keluar 0
num adalah variabel lokal yang digunakan untuk menyimpan masing -masing n-1 Nilai pada setiap panggilan. Di sini kondisi dasar memeriksa apakah angkanya sama dengan nol atau tidak (sejak 0! = 1 dan faktorial tidak didefinisikan untuk angka negatif). Saat tiba kondisi dasar ini, ia mengembalikan nilainya 1 untuk peneleponnya. Sekarang num = 1 Dan ret = 1 x 1.
Saat ini kembali 1 untuk peneleponnya. Sekarang num = 2 Dan ret = 2 x 1 dan seterusnya. Akhirnya kapan num = 5 Nilai pengembalian akan 24 dan hasil akhir adalah ret = 5 x 24. Hasil akhir 120 diturunkan ke pernyataan penelepon awal dan ditampilkan.
Ada satu masalah dalam skrip di atas. Seperti yang saya jelaskan di artikel sebelumnya, fungsi tidak dapat mengembalikan bilangan bulat besar. Jadi diserahkan kepada pengguna untuk menemukan solusi untuk masalah di atas.
Q. Dapatkah kita melakukan rekursi tanpa menggunakan variabel lokal? Jawabannya adalah Ya.
Rekursi tanpa variabel lokal
Lihatlah contoh berikut untuk menampilkan Seri Fibonacci menggunakan rekursi. Relasi kekambuhan dasar adalah:
FIB (0) = 0 FIB (1) = 1 Lain Fib (N) = FIB (N-1) + FIB (N-2) Seri Fibonacci menggunakan rekursi #!/bin/bash fib () a = $ 1 jika [$ a -lt 2]; Kemudian gema $ a else ((--a)) b = $ (fib $ a) ((--a)) c = $ (fib $ a) echo $ ((b+c)) fi untuk i dalam $ dalam $ (seq 0 15) do out = $ (fib $ i) echo $ out done exit 0
Tidak ada variabel lokal yang digunakan dalam skrip di atas. Saya harap Anda dapat memahami aliran skrip selama eksekusi.
Di sini nilainya 15 mewakili jumlah istilah di Seri Fibonacci untuk ditampilkan. Apakah Anda memperhatikan sesuatu yang istimewa mengenai pelaksanaan skrip di atas. Butuh beberapa saat, bukan? Rekursi dalam skrip lebih lambat dari rekursi dalam bahasa pemrograman seperti C.
Dengan artikel ini, saya berencana untuk menyimpulkan bagian fungsi dalam scripting shell. Tetap diperbarui dengan Tecmint untuk memiliki artikel yang akan datang array dan banyak lagi…
- « OpenVPN Server dan Instalasi dan Konfigurasi Klien di Debian 7
- Webmail Rainloop - Klien Email Berbasis Web Modern Modern untuk Linux »