תרגילים
- כתבו פעולה רקורסיבית המקבלת מספר שלם חיובי גדול מאפס, ומדפיסה שורת של כוכביות באורך המספר שהתקבל
- כתבו פעולה רקורסיבית המקבלת שני מספרים שלמים, ומחזירה את שארית החלוקה של אחד בשני בעזרת פעולת חיסור בלבד (העזר ברעיון של דוגמא 3).
- כתבו פעולה רקורסיבית המקבלת מספר שלם, ומחזירה את כמות הספרות האי זוגיות שיש בו (הרחבה של דוגמא 4).
- כתבו פעולה רקורסיבית המקבלת מספר שלם, ומחזירה את סכום ספרותיו (הרחבה של דוגמא 2).
- כתבו פעולה רקורסיבית המקבלת מספר שלם, ומחזירה את סכום הספרות הזוגיות שיש בו (הרחבה של התרגיל הקודם).
- כתבו פעולה רקורסיבית המקבלת מספר שלם וספרה, ומחזירה את כמות הפעמים שהספרה נמצאת במספר.
- כתבו פעולה רקורסיבית המקבלת מספר שלם אי זוגי, ומחזירה את סכום הטור החשבוני מ-1 ועד המספר בקפיצות של 2.(סכום המספרים האי זוגיים מ-1 עד המספר שנמסר כפרמטר)
שאלת אתגר: כתבו פעולה רקורסיבית המקבלת מספר שלם n, ומחזירה את המספר שנמצא במיקום.n בסדרת פיבונצ'י.
תזכורת: סדרת פיבונצ'י מתחילה בספרות 0,1 וכל מספר עוקב הוא סכום של שני המספרים לפניו.
הסדרה מתחילה כך:
0 1 1 2 3 5 8 13 21 34 ….
כך שעבור n = 6, הפעולה תחזיר את המספר 5, מכיוון שהמספר 5 נמצא במיקום השישי בסדרה.
פתרון שאלה מספר 1
עוצרים ב-1:
public static void Star(int n)
{
if( n==1)
Console.Wrile(“*”);
else
{
Console.Wrile(“*”);
Star(n-1);
}
}
עוצרים ב-0:
public static void Star(int n)
{
if( n==0)
return;
Console.Wrile(“*”);
Star(n-1);
}
פתרון שאלה מספר 2 בשדפת c#
תנאי עצירה: המחולק קטן מהמחלק.
public static int Modulo (int n, int x)
{
if( n<x)
return n;
return Modulo (n-x , x);
}
פתרון שאלה מספר 3 בשפת c#
תנאי עצירה: הפרמטר יגיע לאפס.
אסטרטגיה: כל פעם שנראה כי ספרת האחדות היא אי זוגית, נחזיר אחד ונבצע רקורסיה.
כלי עזר:
n%10 → מביא לנו את ספרת האחדות
n/10 → מסיר את ספרת האחדות
odd = אי זוגי
public static int CountOdd(int n)
{
if(n==0)
return 0;
int unit = n%10;
if(unit%2==1) // Odd
return 1+CountOdd(n/10);
return CountOdd(n/10);
}
דוגמה לטבלת מעקב:
פתרון לשאלה מספר 4
public static int SumDigits (int n)
{
if(n==0)
return 0;
int unit = n%10;
return unit+ SumDigits (n/10);
}
פתרון לשאלה מספר 5
Even = זוגי
public static int SumDigitsEven (int n)
{
if(n==0)
return 0;
int unit = n%10;
if (unit%2==0)
return unit+ SumDigits (n/10);
return SumDigits (n/10);
}
פתרון לשאלה מספר 6
public static int CountDigit(int n, int d)
{
if(n==0)
return 0;
int unit = n%10;
if(unit == digit)
return 1+CountDigit( n/10, d);
return CountDigit( n/10, d);
}
פתרון שאלה מספר 7
public static int SumSeriesEven (int n)
{
if(n==1)
return 1;
return n+SumSeriesEven(n-2);
}
פתרון שאלה מספר 8
public static int Pibo (int n)
{
if(n==0)
return 0;
if(n==1)
return 1;
return Pibo(n-1) + Pibo(n-2);
}
דוגמא 1: חישוב מכפלת שני מספרים
- יש לכתוב פעולה המקבלת שני מספרים חיוביים שלמים ומחזירה את מכפלתם בעזרת חיבור וחיסור
- דרך נוספת לראות חישוב זה: x * y = x + x + x …
- יש לזהות מהו הפתרון לבעיה הקטנה ביותר:
- עבור y = 1 הפתרון הוא x (1*x = x)
- ומכאן הדרך לקוד מאוד פשוטה:
public static int Mult (int x, int y)
{
if (y == 1)
return x;
return Mult (x, y - 1) + x;
}
טבלת מעקב
דוגמא 2: כמה ספרות יש במספר
- יש לכתוב פעולה המקבלת מספר ומחזירה את מספר הספרות במספר
- עבור ספרה במספר נגדיל את כמות הספרות ב 1
- יש לזהות מהו הפתרון לבעיה הקטנה ביותר:
- עבור מספר חד ספרתי מספר הספרות הוא 1
- ומכאן הדרך לקוד מאוד פשוטה:
public static int DigitNum (int n)
{
if (n < 10)
return 1;
return DigitNum (n / 10) + 1;
}
דוגמא 3: חישוב מנה בחלוקת שני מספרים בשימוש בפעולות חיבור וחסור בלבד
public static int Div (int a, int b)
{
if (a == b)
return 1;
else
{
if (a < b)
return 0;
return Div (a - b , b) + 1;
}
}