43. More anonymous delegates

מאחר ואני מרגיש שלא הצלחתי להבהיר את החשיבות של Anonymous delegates, אני שולח עוד דוגמה.

הפעם מהעולם המתמטי.

נניח שיש לנו סדרה מתמטית למשל

$ 1,2,3,4,5,6,7,8,9,10,\dots \\ 1,4,9,16,25,36,49,81,100,\dots \\ 4,8,15,16,23,42$

שלושת הסדרות הן סדרות מתמטיות. שתי הראשונות הן אינסופיות והשלישית היא סופית.

לעתים ניתן לתאר סדרה ע”י נוסחה מתמטית שמחזירה את איבר הסדרה במקום הn.

למשל במקרה הראשון ניתן לתאר את הסדרה ע”י הנוסחה $ n \mapsto n$, במקרה השני ע”י $ n \mapsto n^2$,

ובמקרה השלישי קשה למצוא נוסחה.

משהו שניתן לעשות על סדרה מתמטית הוא ליצור ממנה סדרה חדשה שנקראת סדרת הפרשים:

אותה ניתן לייצר ע”י לקיחת כל איבר והסרה ממנו של האיבר הקודם, למשל:

$ 1,2,3,4,5,6,7,8,9,10,\dots $

נקבל את סדרת ההפרשים

$ 2-1,3-2,4-3,5-4,6-5,7-6,8-7,9-8,10-9,\dots \\ 1,1,1,1,1,1,1,1,1,\dots$

דוגמה נוספת:

$ 1,4,9,16,25,36,49,81,100,\dots $

נקבל את סדרת ההפרשים

$ 4-1,9-4,16-9,25-16,36-25,49-36,81-49,100-81,\dots \\ 3,5,7,9,11,13,15,17,19,\dots$

כעת אם בא לנו לתכנת את זה, אפשר להשתמש בAnonymous delegates.

נגדיר delegate כזה

1
public delegate int Sequence(int n);

זה delegate שמייצג סדרה שכל איבריה טבעיים.

כעת נגדיר פונקציה שמקבלת סדרה ויוצרת ממנה סדרת הפרשים:

1
2
3
4
5
6
7
8
public static Sequence Difference(Sequence givenSequence)
{
return delegate(int n)
{
return givenSequence(n + 1) -
givenSequence(n);
};
}

כעת נוכל להשתמש בזה כדי למצוא סדרות הפרש:

למשל הדוגמה הראשונה:

1
2
3
4
5
6
7
8
9
10
11
12
13
Sequence naturalNumbers =
delegate(int n)
{
return n;
};
Sequence naturalDifference =
Difference(naturalNumbers);
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(naturalDifference(i));
}

ידפיס משהו כזה

$ 1,1,1,1,1,1,1,1,1,1$

בדוגמה השנייה

1
2
3
4
5
6
7
8
9
10
11
12
13
Sequence squareNumbers =
delegate(int n)
{
return n*n;
};
Sequence squaresDifference =
Difference(squareNumbers);
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(squaresDifference(i));
}

ידפיס משהו כזה:

$ 3,5,7,9,11,13,15,17,19,21$

מה שממש מגניב זה שאנחנו יכולים להפעיל סדרת הפרש כמה פעמים שאנחנו רוצים ברצף:

1
2
3
4
5
6
7
8
9
10
11
12
13
Sequence fifthPowers =
delegate(int n)
{
return n*n*n*n*n;
};
Sequence powersDifference =
Difference(Difference(Difference(fifthPowers)));
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(powersDifference(i));
}

ונקבל משהו כזה

$ 390,750,1230,1830,2550,3390,4350,5430,6630,7950 $

זהו, בסה"כ מה שעשיתי פה די מסובך לעשות בלי Anonymous delegates.

המשך יום אנונימי טוב

שתף