בעיה בC# ברקורסיה, לא מקבל את הקוד (שגיאת ריצה) - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעיה בC# ברקורסיה, לא מקבל את הקוד (שגיאת ריצה)


DXM

Recommended Posts

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{

static int haluka(int a,int b)
{
if (a == 0)
return 1;
if (a < b)
return 0;
if (b <a)
{
a = a - b;
if (haluka(a, b)==1)
return 1;
else
return 0;
}


}
static void Main(string[] args)
{
int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
int h = haluka(a, b);
Console.Write(h);
}
}
}

מישומה הוא מחליט שישנה שיגאת הרצה בקוד ולא מאפשר לי להריץ אותו,

הוא רושם לי שבמחלקה ישנה בעיה שלא כל הערכים מחזירים ערך

למרות שכולם כן.

מה יכולה להיות הבעיה?

קישור לתוכן
שתף באתרים אחרים

בתור התחלה אין לך טיפול במצב ש-a ו-b שווים.

אבל בכל מקרה הוא לא יקמפל, כי מבחינת הקומפיילר יש מצב שהוא לא ייכנס לאף IF ואז יש בעיה.

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

אתה יכול להוסיף return 1 אחרי כל ה-IF ואז הוא יקמפל, וגם יחזיר תשובה נכונה אם a==b.

קישור לתוכן
שתף באתרים אחרים

או קי הופתי למצב של A וB שווים, יענו ככה

using System; 
namespace ConsoleApplication1
{
class Program
{

static int haluka(int a,int b)
{
if (a == 0)
return 1;
if (a < b)
return 0;
if (b <a)
{
a = a - b;
if (haluka(a, b)==1)
return 1;
else
return 0;
}
if(a==b)
retrun 1;
}
static void Main(string[] args)
{
int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
int h = haluka(a, b);
Console.Write(h);
}
}
}

אבל זה עדיין לא עובד.

קישור לתוכן
שתף באתרים אחרים

כמו שאמרתי קודם:

...

אבל בכל מקרה הוא לא יקמפל, כי מבחינת הקומפיילר יש מצב שהוא לא ייכנס לאף IF ואז יש בעיה.

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

...

אתה חייב שיהיה return מחוץ לכל ה-IF-ים.

קישור לתוכן
שתף באתרים אחרים

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

ואגב זה עובד עכשיו

כלל לא דיברתי על יעילות, על אף שיש יעילות גם ברקורסיה

דיברתי על קריאות, על תכנון קוד, זה הרבה מעבר

ודרכים מוזרות הן לא בהכרח דרכים טובות, צריך לעבוד על זה

בכל אופן שיהיה בהצלחה

קישור לתוכן
שתף באתרים אחרים

זה נכון. בהשוואה ללולאה רגילה, רקורסיה היא הרבה פחות יעילה (לכל קריאה לפונקציה יש overhead).

אם מדובר ברקורסיית זנב, אז יש שפות מסויימות שיודעות לייעל את זה (בעיקר שפות שבהן אין לולאות, ע"ע lisp).

קישור לתוכן
שתף באתרים אחרים

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

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

קישור לתוכן
שתף באתרים אחרים


static int haluka(int a,int b)
{
if (a == 0)
return 1;
if (a < b)
return 0;
if (b <a)
{
a = a - b;
if (haluka(a, b)==1)
return 1;
else
return 0;
}
if(a==b)
retrun 1;
}

זה מה שאתה כתבת אבל זה לא "נכון" ומסודר כך.

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


static int haluka(int a,int b)
{
int idxToReturn = -1;//ככה אפשר לדעת אם יש בעיה במהלך הריצה
if (a == 0)
idxToReturn = 1;
if (a < b)
idxToReturn = 0;
if (b <a)
{
a = a - b;
if (haluka(a, b)==1)
idxToReturn = 1;
else
idxToReturn = 0;
}
if(a==b)
idxToReturn = 1;
retrun idxToReturn;
}

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...