Download as pdf or txt
Download as pdf or txt
You are on page 1of 22

‫מבנה נתונים‬

‫מצגת ‪ – 4‬רקורסיה‬
‫‪ ‬הגדרת רקורסיה‬
‫‪ ‬בעיית העצרת‬
‫‪ ‬טבלת מעקב‬
‫‪ ‬סדרת פיבונאצ'י‬
‫‪ ‬חישוב סכום ספרות‬
‫‪ ‬בדיקה האם פלינדרום‬
‫‪ ‬חישוב ‪GCD‬‬
‫‪ ‬רקורסיה במבני נתונים במחסנית‬
‫‪ ‬מגדלי הנוי‬

‫‪1‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫א‪ .‬הגדרת רקורסיה‬
‫‪ ‬רקורסיה‪ ,‬בתחום התכנות‪ ,‬היא טכניקה ידועה שמהותה – פעולה הקוראת‬
‫לעצמה‪.‬‬
‫יש לכך שימושים מגוונים בכמה תחומים של התכנות‪.‬‬

‫פונקציה רקורסיבית‪:‬‬

‫פונקציה שקוראת לעצמה (מבצעת קריאה רקורסיבית לאותה פעולה)‬

‫רקורסיה ללא מקרה בסיס‬

‫מה התקלה?‬

‫)(‪static void printMe‬‬


‫{‬
‫;)"‪Console.WriteLine("Printing...‬‬
‫;)(‪printMe‬‬
‫}‬

‫)‪static void Main(String[] args‬‬


‫{‬
‫;)(‪printMe‬‬
‫;)(‪Console.ReadKey‬‬
‫}‬

‫‪2‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫‪ ‬הפתרון‪:‬‬
‫הוספת שלב בדיקה עבור מקרה הבסיסי שהוא כל כך פשוט‪ ,‬שניתן להחזיר את‬
‫התשובה באופן מיידי‪.‬‬
‫‪ ‬אחרת‪ ,‬בצע קריאה רקורסיבית למקרה מורכב קטן יותר‬
‫(כלומר‪ ,‬מקרה שהוא צעד לעבר מקרה הבסיס – שהוא מקרה מורכב)‪.‬‬

‫מבנה פונקציה רקורסיבית‪:‬‬

‫)‪static void func(int n‬‬


‫{‬
‫)מקרה בסיס( ‪if‬‬
‫;ערך ‪return‬‬

‫‪else‬‬
‫{‬
‫)מקרה מורכב קטן יותר(‪func‬‬
‫}‬
‫}‬

‫‪ ‬דוגמה‪:‬‬

‫)‪static void printMe(int n‬‬


‫{‬
‫)‪if (n == 0‬‬
‫;‪return‬‬

‫‪else‬‬
‫{‬
‫;)‪Console.WriteLine("Printing..." + n‬‬
‫;)‪printMe(n - 1‬‬
‫;‪return‬‬
‫}‬
‫}‬

‫)‪static void Main(String[] args‬‬


‫{‬
‫;)‪printMe(5‬‬
‫;)(‪Console.ReadKey‬‬
‫}‬

‫‪3‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
.n ‫ ומחזירה ערך‬n ‫דוגמה לפונקציה שמקבלת‬

static int ReturnN(int n)


{
if (n == 1)
return 1;

else
{
return 1+ ReturnN(n - 1);
}
}

static void Main(String[] args)


{
Console.WriteLine(ReturnN(5));
Console.ReadKey();
}

4
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫ב‪ .‬טבלת מעקב‬

‫‪ ‬יש לצתיין בטבלה את העמודות‪:‬‬

‫משתנה‬ ‫תנאי‬ ‫קריאה רקורסיבית‬ ‫ערך מוחזר‬

‫‪ ‬דוגמה בעמוד הבא‪.‬‬

‫‪5‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫שלב א'‬

‫‪ ‬בכוון הקריאה הרקורסיבית‪:‬‬


‫‪ o‬רושמים ערכים בטבלה‪.‬‬
‫‪ o‬מסמנים חץ בכוון הקריאה הרקורסיבית‪.‬‬

‫משתנה‪:‬‬ ‫תנאי‬ ‫קריאה רקורסיבית‪:‬‬ ‫ערך מוחזר‬


‫‪n‬‬ ‫עצירה‪:‬‬ ‫)‪ReturnN (n – 1‬‬
‫‪n==1‬‬
‫‪5‬‬ ‫‪-‬‬ ‫)‪ReturnN (4‬‬ ‫___ = ___ ‪1 +‬‬
‫‪4‬‬ ‫‪-‬‬ ‫)‪ReturnN (3‬‬ ‫___ = ___ ‪1 +‬‬
‫‪3‬‬ ‫‪-‬‬ ‫)‪ReturnN (2‬‬ ‫___ = ___ ‪1 +‬‬
‫‪2‬‬ ‫‪-‬‬ ‫)‪ReturnN (1‬‬ ‫___ = ___ ‪1 +‬‬
‫‪1‬‬ ‫מתקיים‬ ‫‪-‬‬ ‫‪1‬‬

‫שלב ב'‬

‫‪ ‬בכוון חזרה מסמנים‪:‬‬


‫‪ o‬משלימים ערכים בטבלה‪.‬‬
‫‪ o‬מסמנים חץ בכוון חזרה‪.‬‬

‫משתנה‪:‬‬ ‫תנאי‪:‬‬ ‫קריאה רקורסיבית‪:‬‬ ‫ערך מוחזר‬


‫‪n‬‬ ‫‪n==1‬‬ ‫)‪ReturnN (n – 1‬‬
‫‪5‬‬ ‫‪-‬‬ ‫)‪ReturnN (4‬‬ ‫‪1+ 4 = 5‬‬
‫‪4‬‬ ‫‪-‬‬ ‫)‪ReturnN (3‬‬ ‫‪1+ 3 = 4‬‬
‫‪3‬‬ ‫‪-‬‬ ‫)‪ReturnN (2‬‬ ‫‪1+ 2 = 3‬‬
‫‪2‬‬ ‫‪-‬‬ ‫)‪ReturnN (1‬‬ ‫‪1+ 1 = 2‬‬
‫‪1‬‬ ‫מתקיים‬ ‫‪-‬‬ ‫‪1‬‬

‫‪6‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫תרגיל ‪1‬‬

‫‪ .1‬רשום טבלת מעקב עבור )‪ReturnN (6‬‬


‫‪ .2‬רשום טבלת מעקב עבור )‪ReturnN (7‬‬
‫‪ .3‬רשום טבלת מעקב עבור )‪ReturnN (8‬‬

‫‪7‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫בעיית סכום מספרים‬ .‫ג‬

.n-‫ ל‬1 ‫ סכום כל המספרים בין‬

SumN(1) = 1
SumN(2) = 1 + 2 = 3
SumN (3) = 1 + 2 + 3 = 6

SumN (n) = 1 + 2 + 3 + … + (n-1) + n

‫פתרון לא רקורסיבי‬

static int SumN (int n)


{
int i, sum = 0;
for (i = 1; i <= n; i++)
sum = sum + i;

return sum;
}

static void Main(String[] args)


{
int number = 5;
Console.WriteLine(SumN(number));
Console.ReadKey();
}

8
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫פתרון רקורסיבי‬

static int Sum(int n)


{
if (n == 1)
return 1;

else
return n + Sum(n - 1);
}

static void Main(String[] args)


{
int number = 5;
Console.WriteLine(Sum(number));
Console.ReadKey();
}

9
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫טבלת מעקב שלב א'‬

‫משתנה‪:‬‬ ‫תנאי‬ ‫קריאה רקורסיבית‪:‬‬ ‫ערך מוחזר‬


‫‪n‬‬ ‫עצירה‪:‬‬ ‫)‪SumN (n – 1‬‬
‫‪n==1‬‬
‫‪5‬‬ ‫‪-‬‬ ‫)‪SumN (4‬‬ ‫___ = ___ ‪5 +‬‬
‫‪4‬‬ ‫‪-‬‬ ‫)‪SumN (3‬‬ ‫___ = ___ ‪4 +‬‬
‫‪3‬‬ ‫‪-‬‬ ‫)‪SumN (2‬‬ ‫___ = ___ ‪3 +‬‬
‫‪2‬‬ ‫‪-‬‬ ‫)‪SumN (1‬‬ ‫___ = ___ ‪2 +‬‬
‫‪1‬‬ ‫מתקיים‬ ‫‪-‬‬ ‫‪1‬‬

‫טבלת מעקב שלב ב'‬

‫משתנה‪:‬‬ ‫תנאי‪:‬‬ ‫קריאה רקורסיבית‪:‬‬ ‫ערך מוחזר‬


‫‪n‬‬ ‫‪n==1‬‬ ‫)‪ReturnN (n – 1‬‬
‫‪5‬‬ ‫‪-‬‬ ‫)‪SumN (4‬‬ ‫‪5 + 10 = 15‬‬
‫‪4‬‬ ‫‪-‬‬ ‫)‪SumN (3‬‬ ‫‪4 + 6 = 10‬‬
‫‪3‬‬ ‫‪-‬‬ ‫)‪SumN (2‬‬ ‫‪3+ 3 = 6‬‬
‫‪2‬‬ ‫‪-‬‬ ‫)‪SumN (1‬‬ ‫‪2+ 1 = 3‬‬
‫‪1‬‬ ‫מתקיים‬ ‫‪-‬‬ ‫‪1‬‬

‫תרגיל ‪2‬‬

‫‪ .1‬רשום טבלת מעקב עבור )‪SumN (6‬‬


‫‪ .2‬רשום טבלת מעקב עבור )‪SumN (7‬‬
‫‪ .3‬רשום טבלת מעקב עבור )‪SumN (8‬‬

‫‪11‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫בעיית העצרת‬ .‫ד‬

! ‫ העצרת של מספר טבעי מסומנת כך‬


.n-‫ ל‬1 ‫ העצרת מוגדרת כמכפלת כל המספרים בין‬

factorial(1) = 1
factorial(2) = 1*2 = 2
factorial(3) = 1*2*3 = 6
factorial(4) = 1 * 2 * 3 * 4 = 24
factorial(5) = 1 * 2 * 3 * 4 * 5 = 120

factorial(n) = 1 * 2 * 3 * … * (n-1) * n

‫פתרון לא רקורסיבי‬

static int Factorial(int n)


{
int i, fact = 1;
for (i = 1; i <= n; i++)
fact = fact * i;

return fact;
}

static void Main(String[] args)


{
int number = 5;
Console.WriteLine(Factorial(number));
Console.ReadKey();
}

11
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫פתרון רקורסיבי‬

static int Factorial(int n)


{
if (n == 1)
return 1;
else
return (n * Factorial(n - 1));
}

static void Main(String[] args)


{
int number = 5;
Console.WriteLine(Factorial(number));
Console.ReadKey();
}

12
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫ בעיית העצרת‬.‫ה‬

! ‫ העצרת של מספר טבעי מסומנת כך‬


.n-‫ ל‬1 ‫ העצרת מוגדרת כמכפלת כל המספרים בין‬

factorial(1) = 1
factorial(2) = 1*2 = 2
factorial(3) = 1*2*3 = 6
factorial(4) = 1 * 2 * 3 * 4 = 24
factorial(5) = 1 * 2 * 3 * 4 * 5 = 120

factorial(n) = 1 * 2 * 3 * … * (n-1) * n

‫פתרון לא רקורסיבי‬

static int Factorial(int n)


{
int i, fact = 1;
for (i = 1; i <= n; i++)
fact = fact * i;

return fact;
}

static void Main(String[] args)


{
int number = 5;
Console.WriteLine(Factorial(number));
Console.ReadKey();
}

13
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫פתרון רקורסיבי‬

static int Factorial(int n)


{
if (n == 1)
return 1;
else
return (n * Factorial(n - 1));
}

static void Main(String[] args)


{
int number = 5;
Console.WriteLine(Factorial(number));
Console.ReadKey();
}

14
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫טבלת מעקב שלב א'‬

‫משתנה‪:‬‬ ‫תנאי‬ ‫קריאה רקורסיבית‪:‬‬ ‫ערך מוחזר‬


‫‪num‬‬ ‫עצירה‪:‬‬ ‫)‪Factorial(num – 1‬‬
‫‪num==1‬‬
‫‪5‬‬ ‫‪-‬‬ ‫)‪Factorial(4‬‬ ‫___ = ___ * ‪5‬‬
‫‪4‬‬ ‫‪-‬‬ ‫)‪Factorial(3‬‬ ‫___ = ___ * ‪4‬‬
‫‪3‬‬ ‫‪-‬‬ ‫)‪Factorial(2‬‬ ‫___ = ___ * ‪3‬‬
‫‪2‬‬ ‫‪-‬‬ ‫)‪Factorial(1‬‬ ‫___ = ___ * ‪2‬‬
‫‪1‬‬ ‫מתקיים‬ ‫‪-‬‬ ‫‪1‬‬

‫טבלת מעקב שלב ב'‬

‫משתנה‪:‬‬ ‫תנאי‪:‬‬ ‫קריאה רקורסיבית‪:‬‬ ‫ערך מוחזר‬


‫‪num‬‬ ‫‪num==1‬‬ ‫)‪Factorial(num – 1‬‬
‫‪5‬‬ ‫‪-‬‬ ‫)‪Factorial(4‬‬ ‫‪5 * 24 = 120‬‬
‫‪4‬‬ ‫‪-‬‬ ‫)‪Factorial(3‬‬ ‫‪4 * 6 = 24‬‬
‫‪3‬‬ ‫‪-‬‬ ‫)‪Factorial(2‬‬ ‫‪3* 2 = 6‬‬
‫‪2‬‬ ‫‪-‬‬ ‫)‪Factorial(1‬‬ ‫‪2* 1 = 2‬‬
‫‪1‬‬ ‫מתקיים‬ ‫‪-‬‬ ‫‪1‬‬

‫תרגיל ‪3‬‬

‫‪ .1‬רשום טבלת מעקב עבור )‪Factorial (6‬‬


‫‪ .2‬רשום טבלת מעקב עבור )‪Factorial (7‬‬
‫‪ .3‬רשום טבלת מעקב עבור )‪Factorial (8‬‬

‫‪15‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫תרגיל ‪1‬‬

‫‪ .1‬רשום טבלת מעקב עבור )‪Factorial(8) ,Facturial(6‬‬


‫‪ .2‬רשום פעולה רקורסיבית המקבלת ‪ n‬ומחשבת סכום המספרים בין ‪ 1‬ל‪.n-‬‬
‫לדוגמה‪ ,‬עבור )‪ Func(3‬יוחזר ‪.)12223( 6‬‬
‫‪ .3‬רשום טבלת מעקב וערך מוחזר עבור קריאה לפעולה עם פרמטר ‪.7‬‬
‫‪ .4‬רשום טבלת מעקב וערך מוחזר עבור קריאה לפעולה עם פרמטר ‪.11‬‬

‫תרגיל ‪2‬‬

‫‪ .1‬רשום פעולה רקורסיבית המחשבת כפולה של ‪ n‬ב‪:2-‬‬


‫)‪double (1‬‬ ‫=‬ ‫‪2*1‬‬ ‫=‬ ‫‪2‬‬
‫)‪double (2‬‬ ‫=‬ ‫‪2*2‬‬ ‫=‬ ‫‪4‬‬
‫)‪double (3‬‬ ‫=‬ ‫‪2*3‬‬ ‫=‬ ‫‪6‬‬
‫)‪double (4‬‬ ‫=‬ ‫‪2*4‬‬ ‫=‬ ‫‪8‬‬

‫‪ ‬הבעיה נקראת גם בשם "בעיית הארנבות"‪:‬‬


‫‪ o‬יש לנו ארנבות שעומדות בשורה‪ ,‬ממוספרות ‪n ... ,2 ,1‬‬
‫‪ o‬הארנבות הן בעלות שתי אוזניים‪.‬‬
‫‪ o‬יש להחזיר את מספר "האוזניים" בשורה ‪.1,2….n‬‬

‫‪ .2‬רשום טבלת מעקב וערך מוחזר עבור קריאה לפעולה עם פרמטר ‪.7‬‬
‫‪ .3‬רשום טבלת מעקב וערך מוחזר עבור קריאה לפעולה עם פרמטר ‪.11‬‬

‫‪16‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫מספר פיבונאצ'י‬ .‫ו‬

‫ מספר פיבונאצ'י הוא סכום של שני מספרי פיבונאצ'י הקודמים‬

fibonacci(0) = 0
fibonacci (1) = 1
fibonacci (2) = fibonacci (1) + fibonacci (0) = 1+0 = 1
fibonacci (3) = fibonacci (2) + fibonacci (1) = 1+1 = 2
fibonacci (4) = fibonacci (3) + fibonacci (2) = 2+1 = 3
fibonacci (5) = fibonacci (4) + fibonacci (3) = 3+2 =5
fibonacci (6) = fibonacci (5) + fibonacci (4) = 5+3 = 8
fibonacci (7) = fibonacci (6) + fibonacci (5) = 8+5 = 13


fibonacci (n) = fibonacci (n-1) + fibonacci (n-2)

‫פתרון לא רקורסיבי‬

static int Fibonacci(int n)


{
int firstnumber = 0, secondnumber = 1, result = 0;

if (n < 2)
return n;

for (int i = 2; i <= n; i++)


{
result = firstnumber + secondnumber;
firstnumber = secondnumber;
secondnumber = result;
}

return result;
}

public static void Main(string[] args)


{
int number = 5;
Console.Write(Fibonacci(number));

Console.ReadKey();
}

17
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫פתרון רקורסיבי‬

‫‪ ‬רקורסיה הכוללת ‪ 1‬זימונים‪.‬‬

‫)‪public static int Fibonacci(int n‬‬


‫{‬
‫)‪if (n < 2‬‬
‫;‪return n‬‬

‫;)‪return Fibonacci(n - 1) + Fibonacci(n - 2‬‬


‫}‬

‫)‪public static void Main(string[] args‬‬


‫{‬
‫;‪int number = 5‬‬
‫;))‪Console.Write(Fibonacci(number‬‬

‫;)(‪Console.ReadKey‬‬
‫}‬

‫תרגיל ‪3‬‬

‫‪ .1‬רשום טבלת מעקב וערך מוחזר עבור קריאה לפעולה ‪ Fibonacci‬עם פרמטר ‪.7‬‬
‫‪ .2‬רשום טבלת מעקב וערך מוחזר עבור קריאה לפעולה עם פרמטר ‪.11‬‬

‫‪18‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫חישוב סכום ספרות‬ ‫ז‪.‬‬
‫‪ ‬בהינתן מספר שלם‪ ,‬המשימה היא למצוא את סכום ספרותיו של המספר‪.‬‬

‫)‪static int SumDigits(int n‬‬


‫{‬
‫)‪if (n == 0‬‬
‫;‪return 0‬‬
‫;))‪return (n % 10 + SumDigits(n / 10‬‬
‫}‬

‫ח‪ .‬חיפוש תו במחרוזת‬


‫‪ ‬בהינתן מחרוזת ותו‪ ,‬המשימה היא למצוא האם התו קיים במחרוזת‪.‬‬

‫)‪public static Boolean seek(String st, char t‬‬


‫{‬
‫)‪if (st.Length == 0‬‬
‫;‪return false‬‬
‫)‪if (st[0] == t‬‬
‫;‪return true‬‬
‫;)‪return seek(st.Substring(1), t‬‬
‫}‬

‫ט‪ .‬בדיקה האם פלינדרום‬

‫‪ ‬פָּ ִלינְ ְדרֹום הוא מחרוזת שקריאתה משמאל לימין ומימין לשמאל מחזירה‬
‫מחרוזת זהה‪ ,‬למשל‪ ,‬המחרוזות "‪."MADAMIMADAM" ,"123321‬‬
‫‪ ‬בהינתן מחרוזת‪ ,‬המשימה היא למצוא האם המחרוזת פלינדרום‪.‬‬

‫)‪public static Boolean IsPal(String st‬‬


‫{‬
‫)‪if (st.Length == 0 || st.Length == 1‬‬
‫;‪return true‬‬
‫)]‪if (st[0] == st[st.Length - 1‬‬
‫;))‪return IsPal(st.Substring(1, st.Length - 2‬‬
‫;‪return false‬‬
‫}‬

‫‪19‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫חישוב ‪GCD‬‬ ‫י‪.‬‬
‫‪ ‬בהינתן שני מספרים שלמים‪ ,‬המשימה היא למצוא את ‪Greatest (GCD‬‬
‫‪ - )common divisor‬המחלק הגדול ביותר של מספרים הנתונים‪.‬‬
‫‪ ‬לדוגמה ‪ GCD‬של ‪ 21‬ו‪ 28-‬הוא ‪ 4‬ו‪ GCD -‬של ‪ 98‬ו‪ 56-‬הוא ‪:14‬‬

‫)‪public static int GCD(int a, int b‬‬


‫{‬
‫)‪if (a == 0‬‬
‫;‪return b‬‬
‫)‪if (b == 0‬‬
‫;‪return a‬‬
‫)‪if (a == b‬‬
‫;‪return a‬‬

‫‪// a is greater‬‬
‫)‪if (a > b‬‬
‫;)‪return GCD(a - b, b‬‬
‫;)‪return GCD(a, b - a‬‬
‫}‬

‫תרגול‬

‫‪ .1‬כתוב פעולה רקורסיבית המקבלת מספר שלם‪ ,‬מחזירה אמת אם כל‬


‫הספרות במספר זוגיות‪.‬‬
‫‪ .2‬כתוב פעולה רקורסיבית שמקבלת שני מספרים ‪ ,a,b‬הפעולה מחזירה‬
‫אמת אם ‪ b‬מחלק את ‪ a‬ללא שארית ‪,‬שקר אחרת‪.‬‬

‫‪21‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬
‫ מגדלי הנוי‬.‫יא‬
.‫ הרעיון הוא להשתמש בצומת העזר כדי להגיע ליעד באמצעות רקורסיה‬
:‫ פתרון רקורסיבי‬
.C ‫ באמצעות‬,'B'-‫' ל‬A'-‫' מ‬N-1' ‫ העבר דיסקים של‬o
.'C'-‫' ל‬A'-‫ העבר את הדיסק האחרון מ‬o
.A ‫ באמצעות‬,'C'-‫' ל‬B'-‫' מ‬N-1' ‫ העבר דיסקים של‬o

:‫ פתרון‬

static void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod)


{
if (n == 0)
return;
towerOfHanoi(n - 1, from_rod, aux_rod, to_rod);
Console.WriteLine("Move disk " + n + " from rod " + from_rod + " to rod " + to_rod);
towerOfHanoi(n - 1, aux_rod, to_rod, from_rod);
}

21
Ⓒ ‫נכתב ע"י ניצן דולינסקי‬
‫ להעתיק ללא אישור‬/ ‫אין לשכפל‬
‫יב‪ .‬רקורסיה במבני נתונים במחסנית‬
‫‪ ‬נתונה פונקציה ‪:What‬‬

‫)‪public static void What (Stack<Integer> s1, Stack<Integer> s2‬‬


‫{‬
‫))(‪if (! s1.empty‬‬
‫{‬
‫;)(‪int x = s1.Pop‬‬
‫;)‪What (s1, s2‬‬
‫;)‪s1.Push(x‬‬
‫;)‪s2.Push(x‬‬
‫}‬
‫}‬

‫‪ ‬בהינתן המחסניות‪:‬‬

‫]‪s1: [3, 9, 12, 5, 4, 6‬‬


‫‪s2:‬‬

‫‪ ‬הפונקציה מעתיקה את מחסנית ‪ S1‬ל‪S2 -‬‬


‫באותו סדר מבלי לפגוע במחסנית ‪S1‬‬
‫‪ ‬סה"כ סיבוכיות של פונקציה איטרטיבית‬
‫היתה ‪n‬‬
‫‪ ‬כאשר יצרנו פונקציה איטרטיבית לביצוע‬
‫הפעולה היינו צריכים‪:‬‬
‫‪ – 1‬מחסנית עזר‬
‫‪ – 2‬לולאה להוצאת איברים ממחסנית‬
‫מקור למחסנית עזר‪.‬‬
‫‪ – 3‬לולאה להכנסת איברים ממחסנית‬
‫עזר למחסנית מקור ומחסנית תוצאה‬

‫‪22‬‬
‫נכתב ע"י ניצן דולינסקי ‪Ⓒ‬‬
‫אין לשכפל ‪ /‬להעתיק ללא אישור‬

You might also like