الرجوع الي الدرس

أجمع كل الأرقام إلي الرقم المُعطى

الأهمية: 5

أكتب دالة sumTo(n) لحساب مجموع الارقام هكذا numbers 1 + 2 + ... + n.

Write a function sumTo(n) that calculates the sum of numbers 1 + 2 + ... + n.

مثلاً:

sumTo(1) = 1
sumTo(2) = 2 + 1 = 3
sumTo(3) = 3 + 2 + 1 = 6
sumTo(4) = 4 + 3 + 2 + 1 = 10
...
sumTo(100) = 100 + 99 + ... + 2 + 1 = 5050

أستخدم ثلاث طرق مختلفة:

  1. استخدم حلقة for.
  2. استخدم التكرار (مساعدة: sumTo(n) = n + sumTo(n-1) for n > 1)
  3. استخدم المتتالية العددية.

مثال علي الناتج:

function sumTo(n) { /*... your code ... */ }

alert( sumTo(100) ); // 5050
  1. ما الحل الاسرع؟ وما الابطأ؟ ولماذا؟

  2. نستطيع إستخدام التكرار للعد sumTo(100000)?

الحل بإستخدام الحلقة:

function sumTo(n) {
  let sum = 0;
  for (let i = 1; i <= n; i++) {
    sum += i;
  }
  return sum;
}

alert( sumTo(100) );

الحل بإستخدام التكرار:

function sumTo(n) {
  if (n == 1) return 1;
  return n + sumTo(n - 1);
}

alert( sumTo(100) );

الحل بإستخدام هذه المعادلة: sumTo(n) = n*(n+1)/2:

function sumTo(n) {
  return n * (n + 1) / 2;
}

alert( sumTo(100) );
  1. منطقياً حل المعادلة هو أسرع حل لأننا نستخدم ثلاث عمليات فقط لأي رقم n.‘إذا الرياضة تساعد

الدالة المتكررة تأتي في المرتبة الاخيرة في السرعة ببساطة لأنها نفذت الكثير من النداءات و ذلك تطلب الكثير من سياقات التنفيذ و كومة سياقات التنفيذ لذلك فإنها الأبطأ

  1. يعض المحركات تدعم تحسين “tail call”: أذا كان النداء المتكرر هو الأخير في الدالة (مثلما فيsumTo ) إذا فالدالة الخارجية لن تحتاج إلي مواصلة التنفيذ وبالتالي فإن المحرك لا يحتاج إلي تذكر سياق التنفيذ. ذلك يزبل العبء عن الذاكرة لذلك العد إلي sumTo(100000) ممكناً. لكن محرك جافاسكريبت لا يدعم هذا التحسين أو المعظم لا يدعم, لذلك سيكون هناك خطأ: لقد تخطيت الحجم الأقصي لكومة سياق التنفيذ.