עבור לתוכן

לא הולך לי תרגיל ברקורסיה פשוטה שפת C#

Featured Replies

פורסם
  • מחבר

עזוב כבר הסתבכנו. תשמע בוא ניקח דוגמא 453.

השורה הזאת

        return (((n % 10) + MakeSum((n / 10),i,sum)));

עושה ככה:

3+5+4

סבבה. יוצא 12.

עכשיו הבעיה איפה אני מחלק ב-3.

אם לדוגמא אני עושה ככה:

      return (MakeSum(n,0,0)/3);

זה יעבוד. הבעיה שאנחנו לא יודעים שזה 3. ואי אפשר לייבא מהמחלקה MAKESUM את i למחלקה GIVE,נכון?

בשורה של הif אני לא יכול לקבל את הערך ולחלק בi , נכון?

אז איפה לעזזאל אני יכול לחלק בi?

פורסם

אתה כבר מחלק ב-i בשורה של ה-return sum/i. תזכור - אתה צריך לחלק ב-i רק פעם אחת, ולא בכל פעם.

פורסם
  • מחבר

כן אני צריך לחלק רק לאחר חיבור כל המספרים. אבל שחכת שהורדנו את ההשמה לSUM ולכן הוא נשאר זמנית 0

פורסם

אוקי, אז אתה צריך לדעת להגדיל את sum בין קריאה לקריאה של הפונקציה, בדיוק כמו שאתה מגדיל את i.

פורסם
  • מחבר

ואיך אני עושה את זה?.... :sleep:

פורסם

נניח שהיית כותב פונקציה שרק צריכה לחשב את הסכום, מה היית עושה?

פורסם
  • מחבר

לזה אתה מתכוון?

return (((n % 10) + MakeSum((n / 10)

פורסם

אוקי, אבל אתה חייב להעביר את sum כפרמטר, ואסור לך להוסיף אותו לתוצאה של MakeSum (כי התוצאה שלו היא לא באמת סכום, אלא ממוצע). אז מה תעשה?

פורסם
  • מחבר

ואללה לא יודע :nixweiss:

אגב הצלחתי לפתור את זה ככה:

  class sum
{
public static int Give(int n)
{

return (MakeSum(n)/MakeDigits(n));
}
private static int MakeSum(int n)
{
if (n<10)
return (n);
else
return ((n % 10) + MakeSum((n / 10)));
}
private static int MakeDigits(int n)
{
if (n < 10)
return 1;
return (1 + MakeDigits(n / 10));
}

}
}

אבל בכל זאת מעניין אותי איך עושים את זה נכון בפתרון שנתתי בהתחלה...

פורסם

אוקי, הפתרון שלך סבבה בסך הכל.

אבל רק לשם השלמות:

    public static int MakeSum(int n,int i,int sum)
{
if (n == 0)
return (sum/i);
else
return MakeSum(n/10, i+1, sum+(n%10));
}

תחשוב על זה ככה - i סופר את מספר הספרות ב-n, ולכן בכל קריאה לפונקציה מקדמים אותו ב-1. sum סוכם את הספרות ב-n, ולכן בכל קריאה לפונקציה צריך להוסיף לו את הספרה הנוכחית.

פורסם
  • מחבר

אה יפה. אהבתי. עכשיו זה ניראה ממש פשוט.

תודה רבה לך :yelclap: :yelclap:

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים