سؤال

وأحتاج إلى شخص الطبقة لوصف الأشخاص. كل شخص له اسم ومجموعة تتألف من شخص الأجسام، والتي تمثل الأطفال الشخص. الطبقة شخص لديه getNumberOfDescendants الأسلوب، التي تقوم بإرجاع عدد صحيح مساو لعدد من نسل شخص، أي أولاده بالإضافة إلى أحفاد بالإضافة إلى أطفالهم وما إلى ذلك هل هناك طريقة بسيطة للقيام بذلك العودية تستخدمه؟

وماذا لو كنت تريد عدها أحفاد في جيل معين فقط؟ وبعبارة أخرى، getNumberOfDescendants (الجيل الباحث) سيعود عدد الأطفال إذا جيل = 1، وعدد من الأحفاد إذا جيل = 2 وغيرها.

هل كانت مفيدة؟

المحلول

وبالتأكيد.

public class Person {

private Person[] myChildren;

public int getNumberOfDescendants() {
  if (myChildren == null || myChildren.length==0) return 0;
  int myDescendants = 0;
  for (Person child:myChildren) {
    myDescendants += 1; // for this particular child itself
    myDescendants += child.getNumberOfDescendants();  //add the child's children, grandchildren, etc.
  }
  return myDescendants;
}

}

نصائح أخرى

getNumberOfDescendants()
{
  int sum = 0;
  for (int n=0; n < descendants.length; n++)
  {
    sum += 1 + descendants[n].getNumberOfDescendants();
  }
  return sum;
}

لاحظ أن "1 +" هو المكان الوحيد الذي نحن في الواقع زيادة العد. يحصل يسمى هذا الخط مرة واحدة كل سلالة في الشجرة.

وانها ليست حقا العودية، في حد ذاته، ولكن مثيل من فئة يمكن تلخيص نتائج استدعاء getNumberOfDescendants () طريقة لكل من أبنائها.

وبدلا من ذلك، يمكن أن تجعل هذه الطريقة أسرع من خلال وجود كل حالة إبلاغ الأم كلما حصلت على نسل جديد (إما طفل جديد أو من إخطاره من قبل الأطفال). بهذه الطريقة، سيكون به عدد من عدد من أحفاد يكون دائما ما يصل إلى التاريخ.

  public int getNumberDescendents()
  {
    int nDesc = 0;
    if (descendants != null)
    {
      for (Person p : descendants)
      {
        nDesc++; // this child
        nDesc += p.getNumberDescendents(); // this child's desc
      }
    }
    return nDesc;
  }

وبحلول الوقت الذي كتب المثال يصل، وغيرها سجلت أساسا نفس الشيء، لذلك أنا على نشر نوع من بوفرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top