Penggunaan fungsi GENARATER pada PHP

Penggunaan fungsi GENARATER pada PHP

Show

  • Cari disini...
  • Browse

    • Katalog Kelas

      Ikuti materi yang kamu butuhkan

    • Roadmap

      Belajar online dengan terarah

    • Bootcamp

      Codepolitan x Catamyst

  • Explore

    • Tutorial & Artikel

      Temukan Artikel menarik

    • Podcast

      Podcast seputar pemrograman

    • Webinar

      Ikuti Berbagai Webinar

    • Event

      Temukan Event menarik

    • Beasiswa

      Program Beasiswa

    • Discord

      Komunitas Discord

    • Forum

      Diskusi antar Programmer

    • Leaderboard

      Ranking siswa Codepolitan

  • Flashsale
  • Partnership

    • For Company

      Solusi tepat untuk perusahaan

    • For School

      Kerjasama untuk sekolah

    • For Campus

      Kerjasama untuk kampus

    • For Mentor

      Peluang penghasilan untuk mentor

  • Career

LoginRegister

Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)

Penggunaan fungsi GENARATER pada PHP
Penggunaan fungsi GENARATER pada PHP
Penggunaan fungsi GENARATER pada PHP

Pengenalan

Pernahkah Anda perlu mengulang daftar, tetapi operasinya menghabiskan banyak waktu untuk menyelesaikannya? Pernahkah Anda mengalami crash program karena operasi menggunakan terlalu banyak memori? Ini terjadi pada saya ketika saya mencoba mengimplementasikan fungsi yang menghasilkan bilangan prima.

Menghasilkan bilangan prima hingga satu juta kali lebih banyak daripada yang saya inginkan. Tetapi menghasilkan angka hingga 10 juta tidaklah mungkin. Program Saya akan crash atau hanya menggantung. Saya sudah menggunakan saringan Eratosthenes, yang seharusnya lebih efisien dalam menghasilkan bilangan prima daripada pendekatan brute force.

Jika Anda berada dalam situasi yang sama, Anda dapat mencoba menggunakan algoritma yang berbeda. Ada algoritma pencarian dan algoritma penyortiran yang bekerja lebih baik pada input yang lebih besar. Kelemahannya adalah algoritma tersebut mungkin lebih sulit untuk dipahami segera. Pilihan lainnya adalah menggunakan bahasa pemrograman yang berbeda.

Bahasa yang dikompilasi mungkin dapat memproses kode secara signifikan lebih cepat. Tetapi menggunakan bahasa lain mungkin tidak praktis. Anda juga dapat mencoba menggunakan multiple thread. Sekali lagi, ini mungkin tidak praktis karena bahasa pemrograman Anda harus mendukung ini.

Untungnya, dengan JavaScript, ada pilihan lain. Jika Anda memiliki tugas komputasi intensif, Anda dapat menggunakan iterator dan generator untuk mendapatkan beberapa efisiensi. Iterator adalah properti dari suatu kumpulan JavaScript.

Iterator meningkatkan efisiensi dengan memungkinkan Anda mengonsumsi item yang ada dalam daftar satu per satu seolah-olah itu adalah aliran. Generator adalah jenis fungsi khusus yang dapat menghentikan eksekusi. Menerapkan generator memungkinkan Anda menghasilkan data satu potong sekaligus tanpa perlu menyimpannya dalam daftar terlebih dahulu.

Iterator

Pertama-tama, mari kita tinjau berbagai cara yang dapat Anda lakukan perulangan melalui suatu kumpulan pada JavaScript. Sebuah loop dari bentuk for (initial; condition; step) { ... } akan menjalankan perintah-perintah dalam tubuhnya beberapa kali. Demikian pula, perulangan jenis while akan menjalankan perintah di dalam tubuhnya selama kondisinya benar.

Anda dapat menggunakan perulangana ini untuk melintasi daftar dengan menaikkan variabel indeks pada setiap iterasi. Iterasi adalah eksekusi dari tubuh perulangan. Perulangan ini tidak tahu tentang struktur daftar Anda. Mereka bertindak sebagai penghitung.

Perulangan for/in dan perulangan for/of dirancang untuk melakukan iterasi atas struktur data tertentu. Iterasi atas struktur data berarti Anda melangkah melalui masing-masing elemennya. Perulangan for/in melakukan iterasi atas kunci dalam objek JavaScript yang sederhana. Perulangan for/of melakukan iterasi atas nilai-nilai iterable. Apa itu iterable? Sederhananya, sebuah iterable adalah objek yang memiliki iterator. Contoh iterable adalah array dan set. Iterator adalah properti dari objek yang menyediakan mekanisme untuk melintasi objek.

Apa yang membuat iterator istimewa adalah bagaimana ia melintasi suatu kumpulan data. Perulangan lain perlu memuat seluruh kumpulan data di depan untuk mengulanginya, sedangkan iterator hanya perlu mengetahui posisi saat ini dalam kumpulan data.

Anda mengakses item saat ini dengan memanggil metode iterator berikutnya. Metode selanjutnya akan mengembalikan nilai item saat ini dan boolean untuk menunjukkan ketika Anda telah mencapai akhir dari kumpulan data. Berikut ini adalah contoh pembuatan iterator dengan array.

const alpha = ['a','b','c'];
const it = alpha[Symbol.iterator]();

it.next();  //{ value: 'a', done: false }
it.next();  //{ value: 'b', done: false }
it.next();  //{ value: 'c', done: false }
it.next();  //{ value: undefined, done: true }

Anda juga dapat melakukan iterasi atas nilai-nilai iterator menggunakan perulangan for/of. Gunakan metode ini ketika Anda tahu Anda ingin mengakses semua item dalam objek. Ini adalah bagaimana Anda akan menggunakan perulangan untuk iterasi melalui daftar sebelumnya:

for (const elem of it){
    console.log(elem);
}

Mengapa Anda menggunakan iterator? Menggunakan iterator bermanfaat ketika biaya komputasi untuk memproses daftar menjadi tinggi. Jika Anda memiliki sumber data yang sangat besar, ini dapat menyebabkan masalah dalam program Anda jika Anda mencoba mengulanginya karena seluruh kumpulan data harus dimuat.

Dengan iterator, Anda dapat memuat data dalam potongan. Ini lebih efisien karena Anda hanya memanipulasi bagian daftar yang Anda butuhkan, tanpa mengeluarkan biaya tambahan untuk memproses seluruh daftar.

Contohnya adalah Anda telah memuat data dari file atau database, dan Anda ingin secara progresif menampilkan informasi di layar. Anda bisa membuat iterator dari data dan mengatur event handler untuk mengambil beberapa item setiap kali peristiwa terjadi. Ini adalah contoh implementasi seperti apa yang mungkin akan terlihat:

let posts = load(url);
let it = posts[Symbol.iterator]();

function loadPosts(iterable, count) {
    for (let i = 0; i < count; i++) {
        display(iterable.next().value);
    }
}

document.getElementById('btnNext').onclick = loadPosts(it, 5);

Generator

Jika Anda ingin membangun collection, Anda dapat melakukannya dengan generator. Fungsi generator dapat mengembalikan nilai satu per satu dengan menghentikan eksekusi pada setiap iterasi. Saat Anda membuat instance dari generator, item ini dapat diakses menggunakan iterator. Ini adalah sintaks umum untuk membuat fungsi generator

function *genFunc() {
    ...
    yield value;
}

* Menandakan bahwa ini adalah fungsi generator. Kata kunci yield menghentikan fungsi dan menyuplai kondisi generator pada saat itu. Mengapa Anda menggunakan generator? Anda akan menggunakan generator ketika Anda ingin secara algoritma menghasilkan nilai dalam kumpulan data. Ini sangat berguna jika Anda memiliki kumpulan data yang sangat besar atau tak terbatas. Mari kita lihat contoh untuk memahami bagaimana ini akan membantu kita.

Misalnya Anda memiliki game biliar online yang Anda buat, dan Anda ingin mencocokkan pemain dengan ruang permainan. Tujuan Anda adalah untuk menghasilkan semua cara Anda dapat memilih dua pemain berbeda dari daftar 2.000 gamer Anda. Kombinasi dua pemain yang dihasilkan dari daftar ['a', 'b', 'c', 'd'] adalah ab, ac, ad, bc, bd, cd. Ini adalah solusi menggunakan perulangan bersarang:

function combos(list) {
    const n = list.length;
    let result = [];
  
    for (let i = 0; i < n - 1; i++) {
        for (let j = i + 1; j < n; j++) {
            result.push([list[i], list[j]]);
        }
    }
    
    return result;
}

console.log(combos(['a', 'b', 'c', 'd']));

Sekarang coba jalankan fungsi dengan daftar 2.000 elemen. (Anda dapat menginisialisasi daftar Anda menggunakan perulangan untuk menambahkan angka 1 hingga 2.000 ke array). Apa yang terjadi sekarang ketika Anda menjalankan kode Anda?

Ketika saya menjalankan kode di editor online, halaman web macet. Saat saya mencobanya di konsol di Chrome, saya bisa melihat hasil outputnya mencetak perlahan. Namun, CPU komputer saya mulai bekerja dengan kondisi yang begitu berat, dan saya harus memaksa keluar dari Chrome. Ini adalah kode yang direvisi menggunakan fungsi generator:

function *combos(list) {
    const n = list.length;
    for (let i = 0; i < n - 1; i++) {
        for (let j = i + 1; j < n; j++) {
            yield [list[i], list[j]];
        }
    }
}

let it = combos(['a', 'b', 'c', 'd']);
it.next();  

Contoh lain adalah jika kita ingin menghasilkan angka dalam deret Fibonacci hingga tak terbatas. Berikut ini salah satu penerapannya:

function *fibGen() {
    let current = 0;
    let next = 1;
    
    while(true) {
        yield current;
        let nextNum = current + next;
        current = next;
        next = nextNum;
    }
}

let it = fibGen();

it.next().value;    //0
it.next().value;    //1
it.next().value;    //1
it.next().value;    //2

Biasanya, perulangan tak terbatas akan merusak program Anda. Fungsi fibGen mampu berjalan selamanya karena tidak ada kondisi berhenti. Tetapi karena ini adalah generator, Anda mengontrol kapan setiap langkah akan dijalankan.

Meninjau

Iterator dan generator berguna ketika Anda ingin memproses kumpulan data secara bertahap. Anda mendapatkan efisiensi dengan melacak keadaan kumpulan data, setidaknya semua item dalam kumpuluan data tersebut. Item dalam kumpulan data dievaluasi satu per satu, dan evaluasi sisa dari kumpulan data ditunda hingga nanti.

Iterator menyediakan cara yang efisien untuk melintasi dan memanipulasi daftar yang berjumlah besar. Generator menyediakan cara yang efisien untuk membuat daftar tersebut. Anda harus mencoba teknik ini ketika Anda akan menggunakan algoritma yang kompleks atau mengimplementasikan pemrograman paralel untuk mengoptimalkan kode Anda.

Jika Anda mencari sumber daya tambahan untuk dipelajari atau digunakan dalam pekerjaan Anda, periksa apa yang kami miliki di Envato Market.

Sumber lainnya

  • Design Patterns: Elemen Perangkat Lunak Berorientasi Objek yang Dapat Digunakan Kembali: Pola Iterator
  • Spesifikasi ECMAScript untuk Iterator dan Generator
  • Struktur dan Interpretasi Program Komputer - Bab 3.5: Streaming