עזרה ברקורסיה JAVA

hen232

New member
עזרה ברקורסיה JAVA

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

שאלה ראשונה:
http://img707.imageshack.us/img707/3218/325e.png

והזה שורת הקוד שאני כתבתי:
קוד:
    public static int digitDiffer (int a, int b)
   {
     
       if ( a < 10)
       {
           return 1;
       }
       
       if(b < 10)
       {
           return 1;
           
       }
       
       if (b < a)
       {

           return digitDiffer(a/10,b)+1;
       }
       
       if (a < b)
       {

          return digitDiffer(a,b/10)+1;
       }
       

       return digitDiffer(a/10,b/10);
   }


הקוד עובר קימפול אבל שאני מריצה כדי לבדוק עם המספרים לדוגמה
25865 ו- 54, התשובה יוצאת 5 במקום 2


שאלה שניה:

http://img845.imageshack.us/img845/7518/8ipm.jpg

לשאלה הזאת אני אפילו לא יודעת איך לגשת.


תודה מראש לעוזרים
חן.
 

פונציק

New member
שאלה 1

package help;


import java.util.Scanner;

public class help1 {





public static void main(String [ ] args){
int len = 0;
int i = 2;
while (i> 0)
{
Scanner keyboard = new Scanner(System.in);
System.out.println("enter an integer");
int myint = keyboard.nextInt();
int counter = 0;

while (myint > 0)
{
myint = myint/10;
counter++;


}
if (len == 0)
len = counter;
else
System.out.println("the length difference between the integers is:" + Math.abs(len-counter));
i--;





}

}

}
 

פונציק

New member
אני לא בטוח לגבי הרקורסיה

בגלל שאף פעם לא למדתי בכיתה, אין לי מושג לגבי כל מיני אילוצים, אז לפני שאני פותר את מס. 2, תגידי לי אם צריך לעשות משהו שונה.
 

Guy Yafe

New member
הכוונה

שאלה 1:
אם אני מבין נכון, את צריכה לקבל שני מספרים ולתת את ההפרש בין מספרי הספרות שלהם. כלומר אם תקבלי מספר דו ספרתי ומספר חמש-ספרתי, תצטרכי להחזיר את התשובה 3.

במקרה שלך, התנאים הם לא נכונים: קחי לדוגמה מקרה בו a=1, b=1000. התשובה הרצויה היא 3, ואילו התוכנית שלך תחזור בתנאי הראשון ותחזיר 1.
בואי ננתח את השאלה במילים:
אם שני המספרים הם אפס, כמובן שההפרש בין הספרות שלהם הוא אפס, ואת יכולה פשוט להחזיר אפס. זה תנאי הבסיס שלך. את בודקת אותו על ידי השוואת שני המספרים לאפס (תנאי 'וגם')
אם אחד המספרים הוא אפס והשני לא, הפרש הספרות ביניהם הוא אחד ועוד הפרש הספרות בין אפס למספר השני חלקי עשר. את הבדיקה הזו את יכולה לעשות על ידי מכפלת שני המספרים ולראות אם היא אפס.

אם שני המספרים אינם אפס, הפרש הספרות ביניהם זהה להפרש הספרות בין כל אחד מהן חלקי עשר.

שאלה 2:
כאן השאלה מחולקת לשניים:
א. מציאת סכום הספרות: את זה תעשי על ידי שיטת עזר רקורסיבית כפי שהציעו לך.
הדרך היא כל פעם להוסיף את השארית של חלוקת המספר בעשר, לקריאה הרקורסיבית עם חלוקת המספר בעשר.
יש כל מיני שיטות לקחת בחשבון את הסימן. אחת מהן היא כל פעם להעביר לקריאה הרקורסיבית את המספר כפול -1 (מינוס אחד).

ב. אם התוצאה של (א.) היא אפס, המספר מתחלק ב-11. אם היא אינה אפס אבל קטנה מ-11, המספר אינו מתחלק ב-11. אחרת יש לקרוא קריאה רקורסיבית עם התוצאה של א.
 

hen232

New member
שאלה ראשונה

שיפצתי את התשובה ל
public static int digitDiffer(int a, int b)
{
if (a == 0 && b == 0)
{
return 0;
}

if (a == 0)
{
return 1 + digitDiffer(a, b / 10);
}

if (b == 0)
{
return 1 + digitDiffer(a / 10, b);
}
return digitDiffer(a / 10, b / 10);
}


עכשיו זה עובד אבל בכל זאת אשמח לקבל חוות דעת אם זה נראה טוב.
 

Guy Yafe

New member
נראה טוב. אם את רוצה, אפשר לקצר קצת:

public static int digitDiffer(int a, int b)
{
if (a == 0 && b == 0)
{
return 0;
}

else if (a * b == 0)
{
return 1 + digitDiffer(a / 10, b / 10);
}
else return digitDiffer(a / 10, b / 10);
}

זה לא יותר יעיל או פחות יעיל. לדעתי קצת יותר יפה.
 
למעלה