## 11. Tekrardan kaçının, tekrar!

Bir önceki derste gördüğümüz Kural #3 çok önemlidir, bu nedenle bu konuyu tekrar etme zorunluluğu hissediyorum.

Kural # 3
  Bilgisayar programı yazarken aynı kodları tekrar yazmayın.
  Tekrar ediyorum: aynı kodları tekrar yazmayın!

### Tekrar!

Gazete dağıtımına en son getirdiğimiz çözümde az da olsa tekrarlar vardı. Örneğin `turn_left()`komutu `turn_right()`'ı tanımlayabilmek için ardı ardına üç kez kullanıldı. Benzer şekilde `climb_up_four_stairs()`'in tanımlanmasında `climb_up_one_stair()`dört kez kullanıldı. Bu 3 numaralı kurala ters düşüyor. Bu tekrarlardan kaçınmanın bir yolu Reeborg'un özel bir komut yardımıyla işlemleri tekrar etmesini sağlamak olabilir.

Reeborg'un bir işlemi tekrar etmesini sağlamak için `repeat()` komutunu kullanabiliriz:
`repeat(` işlemin adı, `kaç kez yapılacağı)`

işlemin adı parantez kullanılmadan belirtilmelidir:

    def turn_right():
        repeat(turn_left, 3)

### Sıra sizde

Gazete dağıtımı programında `repeat()` komutunu kullanabildiğiniz her yerde kullanın ve daha kısa bir program elde edin. Programın doğru çalıştığından emin olun.

### Sizi Uğraştıralım

Bu dersi bir kaç alıştırmayla bitireceğiz. Bu dersin temasına uygun olarak, ilk iki alıştırmamız duvarları yapmak dersindeki alıştırmaların tekrarı olacak. Bunları çözebilmek için yeni öğrendiğiniz komutları [def, `repeat()`] kullanmalısınız

### Engelleri atlamak

Reeborg engelli atlama yarışmasına katılıyor. Aşağıdaki şekillerde olduğu gibi Reeborg'un yarışmayı hızlı bir şekilde tamamlamasını sağlayan YENİ bir program yazın, dünya dosyası hurdles1.wld.

`jump_hurdle()`(engel atla) adında aşağıdaki şekildeki gibi hareket eden yeni bir komut tanımlamak yararlı olacaktır.

Yeni programınızı bir önceki ile karşılaştırın. [Kaydetmiştiniz, değil mi?]

### Hasat zamanı

Hasat zamanı! Reeborg'un evinin bahçesindeki havuçları (bipler) toplamasını sağlayan bir program yazınız, dünya dosyası harvest1.wld.

Programınız aşağıdaki komutları tanımlamalıdır.

    move_to_first_row()
    harvest_two_rows()
    move_right_to_next_row()

Bu komutları aşağıda olduğu gibi daha çok parçaya ayırabilirsiniz.

    def harvest_two_rows():
        harvest_one_row()
        move_left_to_next_row()
        harvest_one_row()

tabi bunu iyi bir `harvest_one_row()`tanımlamasıyla elde edebilirsiniz. Parçalara ayırma işlemini kendi mantığınıza göre de yapabilirsiniz. Benim çözümüm aşağıdaki gibi, üç yeni tanımlamaya ihtiyaç var ve az da olsa hala tekrarlama var:

    move_to_first_row()
    harvest_two_rows()
    move_right_to_next_row()
    harvest_two_rows()
    move_right_to_next_row()
    harvest_two_rows()
    turn_off()

Yeni programınızı bir önceki ile karşılaştırın.

### Yine hasat zamanı!

Yine hasat zamanı! Ancak bu defa satırlar diagonal bir şekilde yerleştirilmiş. Reeborg'un biplerle temsil edilen tüm havuçları toplamasını sağlayın. Dünya dosyası harvest2.wld.

Bir önceki örnekte de olduğu gibi, programınız aşağıdaki komutları içeren tanımlamaları yapabilir:

    move_to_first_row()
    harvest_two_rows()
    move_right_to_next_row()

Bu komutların tanımlamaları, öncekilerden farklı olacaktır. Ancak bu tanımlamalar doğru olarak yapıldıktan sonra, programınız az önceki örnekte olduğu gibi aşağıdaki gibi yazılabilir:

    move_to_first_row()
    harvest_two_rows()
    move_right_to_next_row()
    harvest_two_rows()
    move_right_to_next_row()
    harvest_two_rows()
    turn_off()

Dikkat, duvara çarpmayın! Hasata nereden ve hangi yönde başlayacağınızı düşünün. Bunu bir kağıda çizmeniz size yardımcı olur.

Tekrardan kesinlikle kaçının - - Reeborg kendi kendine karar verebilseydi ...