JavaScript İçinde Özyineleme – JSManifest

JavaScript İçinde Özyineleme – JSManifest

Özyineleme konusunda yeniyseniz, bu makale umarız kavramı biraz daha net anlamanıza yardımcı olur. JavaScript geliştiricilerinin güçlü uygulamalar oluşturmalarına olanak tanıyan birçok teknik vardır ve bugün bunları gözden geçireceğiz. özyineleme–bir koşul karşılanana kadar kendisini çağıran bir işlev.

Örneğin, dillerinin genişliklerinin toplamını hesaplamak istediğimiz bir kurbağa listemiz olduğunu varsayalım.

Hedefimize ulaşmanın birkaç yolu olsa da, bu yazı uğruna nasıl çalıştığını açıklamak için özyinelemeyi kullanacağız.

const data = [
  {
    id: 1,
    name: 'Olly',
    widthOfTongue: 2.09,
    gender: 'Male',
    bodyColor: 'Mauv',
  },
  {
    id: 2,
    name: 'Odo',
    widthOfTongue: 16.54,
    gender: 'Male',
    bodyColor: 'Aquamarine',
  },
  {
    id: 3,
    name: 'Christal',
    widthOfTongue: 19.35,
    gender: 'Female',
    bodyColor: 'Turquoise',
  },
  {
    id: 4,
    name: 'Aube',
    widthOfTongue: 23.39,
    gender: 'Male',
    bodyColor: 'Violet',
  },
  {
    id: 5,
    name: 'Toiboid',
    widthOfTongue: 4.79,
    gender: 'Male',
    bodyColor: 'Fuscia',
  },
]

function findTotalFrogWidths(totalWidth, frogs) {
  if (!Array.isArray(frogs) || frogs.length < 0) {
    console.warn(
      'Could not evaluate the sum of the widths of the frogs tongues. Please check your "frogs" argument because the data type was incorrect',
    )
    return totalWidth
  }

  if (frogs.length === 0) {
    return totalWidth
  }

  if (frogs.length > 0) {
    return findTotalFrogWidths(
      (totalWidth += frogs.shift().widthOfTongue),
      frogs,
    )
  }
}

const result = findTotalFrogWidths(0, data)

console.log(result) 

Bu örnek kod, hedefine ulaşana kadar kendisini etkin bir şekilde çağırır – kurbağanın dillerinin tüm genişliklerinin toplamı.

İşte fonksiyonun içinde neler oluyor:

İlk olarak, herhangi bir nedenle geçersiz bir kurbağa argümanı geçirip geçirmediğimizi kontrol eder. Bu, uygulamanın çökmesini önlemek ve bunun yerine ilk sayıyı döndürmek için kullanılır. Biz de kullandık console.error hatasını geliştiriciye bildirmek ve daha iyi hale getirmek için.

olduğu gibi köri fonksiyonları, bir işlevi özyineleme işlevi yapan uyulması gereken kurallar vardır. Aksi takdirde, bir işlev bir özyineleme işlevi olmaz. Bir özyineleme işlevi yaparken göz önünde bulundurulması gereken en önemli üç temel özellik vardır:

Özyinelemeler İçin Üç Önemli Kural

1. Fonksiyonun kendi kendini yok eden bir koşulu olmalıdır.

Tüm özyineleme işlevlerinin uyması gereken üç önemli kuraldan ilki, işlevin kendisini sonlandırmak (veya kendini yok etmek) için kullanabileceği bir koşula sahip olmaktır.

Kendini sona erdirmek için bir koşul olmadan, kodunuz beklenmedik hatalarla tanıtılması için çok iyi bir şansa sahiptir. Genellikle, bu hatalar kaçınmak istediğiniz hatalardır çünkü genellikle sonsuz döngüler veya yanlış veri türleribu da uygulamanızın çökmesine neden olur.

Ancak, günün sonunda her zaman bir sonlandırma koşulu olacaktır, ancak kararları veren siz olmak istersiniz. Özyinelemeler için ana işlerinizden biri budur.

Aksi takdirde, işlevinizin sonsuza kadar çalışma şansı vardır, çünkü sonlandırma koşulu olmadan bildiği tek şey, bir şey onu durdurana kadar kendisini çağırmak— ve bu bizim en kötü kabusumuzdur: sonsuz döngü.

Daha önceki örnek kodumuzda, ilk koşulumuz şuydu: sonlandırma koşulu:

if (!Array.isArray(frogs) || frogs.length < 0) {
  console.warn(
    'Could not evaluate the sum of the widths of the frogs tongues. Please check your "frogs" argument because the data type was incorrect',
  )
  return totalWidth
}

Eğer frogs argüman geçersiz bir veri türüydü, uygulamamız bu koşul olmadan çökmüş olabilir, çünkü bundan sonraki kod yalnızca dizilerin kullanabileceği yöntemleri kullanıyordu:

if (frogs.length === 0) {
  return totalWidth
}

Öyleyse, işlevi aşağıdaki gibi yanlış veri türünü kullanarak çağırırsak null örneğin:

const result = findTotalFrogWidths(0, null)

Ardından programın çökmesine neden olan bir hata alıyoruz:

"TypeError: Cannot read property 'length' of null
    at findTotalFrogWidths (tewoyod.js:40:13)
    at tewoyod.js:52:16
    at https://static.jsbin.com/js/prod/runner-4.1.7.min.js:1:13924
    at https://static.jsbin.com/js/prod/runner-4.1.7.min.js:1:10866"

2. fonksiyon zorunlu temel durum koşuluna sahip olmak

Üç temel özelliğin ikincisi, bir temel koşula sahip olmaktır. Bir temel koşulun özyinelemeli bir işlevdeki rolü, hedef hedefinizi temsil etmesi dışında sonlandırma koşuluna çok benzer – mutlu bir son!

Baz durumlar genellikle bir eğer Beyan. Kod parçacığındaki ikinci koşulumuz şuydu: temel durum:


if (frogs.length === 0) {
  return totalWidth
}

Temel koşul olmasının nedeni, frogs dizi boşyinelenecek başka öğe yok, bu yüzden artık yapamayız, bu yüzden sadece toplamı döndürürüz.

3. Kendini arar

Ve son olarak, üçünden sonuncusu, koşulu hala geçerliyse işlevin kendisini çağırması gereken son bir koşulu tanımlar (bu, şu anlama gelir: sonlandırmak ve temel koşul karşılanmadı).

Özyinelemenin bu kısmı, “tekrar” içinde özyineleme. Temel veya sonlandırma koşulunun karşılanabilmesi için işlevin tekrarbiri tatmin olana kadar devam etmek için itelf yapın.


Bir örnekten alınan farklı bir örneğe bakalım. yığın akışı bağlantısı:

function test(x) {
  for (var i = 0; i < 10; i++) {
    console.log(x + ' - ' + i)
  }
  if (x < 3) {
    test(x + 1)
  }
}

test(0)

Bu snippet’te, test argüman alan bir fonksiyondur x (bir sayı türü olmalıdır) ve değerini artırırken kendini tekrar tekrar çağırır. x artık daha az olmayana kadar 3.

Çözüm

Ve bu, bu makalenin sonunu tamamlıyor! Umarım bunu değerli bulmuşsunuzdur ve gelecekte daha fazlasını ararsınız!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.