Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

En büyüğünü özyinelemeli olarak bulmak

Konu, 'D Dili' kısmında acehreli tarafından paylaşıldı.

  1. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Erdem C/C++ forumunda şöyle bir sözde kod vermişti:

    http://forum.ceviz.net/c-c/120727-recursive-fonksiyon-ornegi-3.html#post712294

    D'de yazdım:

    Kod:
    import std.range;
    import std.exception;
    
    ElementType!R enBüyüğü_(R)(R r)
    in {
        assert(!r.empty);
    
    } body {
        auto aday = r.front;
        r = r[1..$];
    
        if (!r.empty) {
            auto diğerAday = enBüyüğü_(r);
            if (diğerAday > aday) {
                aday = diğerAday;
            }
        }
    
        return aday;
    }
    
    ElementType!R enBüyüğü(R)(R r)
        if (isInputRange!R)
    {
        enforce(!r.empty);
        return enBüyüğü_(r);
    }
    
    unittest
    {
        assert(enBüyüğü([ 1, 2, 10, -7, 5, 20, 1, 0, -3 ]) == 20);
    }
    
    void main()
    {}
    
    Notlar:

    * Giriş işlevi olan enBüyüğü() parametrenin geçerliliğini enforce() ile denetliyor. Artık ondan sonrası gerçekleştirmenin sorumluluğuna girdiği için enBüyüğü_ işlevinde in bloğu kullandım çünkü enBüyüğü_'nin r boş iken çağrılması gerçekleştirmedeki bir yanlışlığa işaret eder.

    * enBüyüğü_'nde tek return komutu olsun diye kod biraz fazla karmaşıklaştı. Şu daha kolay olurdu ama çift return suçu işlemiş olurdu: :p

    Kod:
    body {
        auto aday = r.front;
        r = r[1..$];
    
        if (r.empty) {
            return aday;
        }
    
        auto diğerAday = enBüyüğü_(r);
    
        return (diğerAday > aday) ? diğerAday : aday;
    }
    Böyle yapınca bir 'aday = diğerAday' atamasına da gerek kalmamış oldu.

    Ali
     
  2. acehreli

    acehreli Ali Çehreli

    Kayıt:
    19 Ekim 2002
    Mesajlar:
    4,973
    Beğenilen Mesajlar:
    2
    Hemen bir düzeltme: r[1..$] ifadesi aralığın uygun bir opSlice'ının olmasına dayanıyor. Halbuki bu algoritma yalnızca InputRange gerektirmeli. Şöyle olmalı:

    Kod:
    ElementType!R enBüyüğü_(R)(R r)
    in {
        assert(!r.empty);
    
    } body {
        auto aday = r.front;
        r.popFront();           // <---
    
        if (r.empty) {
            return aday;
        }
    
        auto diğerAday = enBüyüğü_(r);
    
        return (diğerAday > aday) ? diğerAday : aday;
    }
    
    // ...
    
        assert(enBüyüğü(iota(10)) == 9);    // <-- Yeni test
    
    Ali
     
  3. Erdem⁣

    Erdem⁣ Üye

    Kayıt:
    1 Temmuz 2012
    Mesajlar:
    141
    Beğenilen Mesajlar:
    22
    Meslek:
    Programcı
    Şehir:
    Eskişehir
    Güzel bir örnek olmuş teşekkürler.

    Aslında bana da döngü kullanmak daha basit geliyor :)