|עזרה|פונקציה רקרוסיבית בשפת C VS - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

|עזרה|פונקציה רקרוסיבית בשפת C VS


DancingBear

Recommended Posts

לאחרונה התבקשתי לכתוב פונקציה רקרוסיבית שעבור תנאים מסויימים מחזירה 1 אם התנאים לא מתקיימים היא מחזירה 0.

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

המספר תקין אם במקום הזוגי יש ספרה זוגית ובמקום האי זוגי יש ספרה איזוגית, כך למשל 1234

1 במקום הראשון, ספרה אי זוגית במקום אי זוגי

2 במקום זוגי, וגם הספרה זוגית

3 במקום אי זוגי וגם הספרה אי זוגית

4 במקום זוגי וגם הוא זוגי

לכן המספר תקין והפונקציה צריכה להחזיר לי 1

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

numDigits הינה פונקציה המחזירה את מספר הספרות במספר כלשהו (1234=4)



int checkDigits(int num, int numDigits)

{

if (num<10)
{
if ((numDigits%2)==0)
{
if ((num%2)==0)
{
return 1;

}

else
return 0;
}
else
if ((num%2)!=0)
{
return 1;
}
else
return 0;
}
return (((checkDigits(num/10, numDigits-1)+checkDigits(num%10, numDigits))));
}

הפונקציה כרגע מחזירה לי את מספר התנאים שהתקיימו (במקרה של 1234 אקבל 4 אבל אני צריך שתחזיר לי 1 במקרה זה)

אני חושב שמה שצריך לעשות זה פשוט לחלק את הRETURN הסופי במספר הספרות אך אין לי מושג איך..

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

כל סוג של עזרה תתקבל בברכה...

וסליחה על המלל הארוך

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

הקוד שלך הרבה יותר מסורבל ממה שהוא צריך להיות.

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

חוץ מזה, לא הבנתי - מספר הספרות נתון מראש? הפונקציה לא צריכה לחשב אותו תוך כדי ריצתה?

נ.ב. אין צורך לציין בכותרת שאתה כותב ב-Visual Studio, זה לא רלוונטי לשאלה... (שהיא בעיה אלגוריתמית)

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

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

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

אני אוסיף את הקוד המלא עם הMAIN שאותו שיניתי על מנת שיפתור את הבעיה והקוד כרגע עובד כביכול (הוא כן אומר לי אם המספר עונה על הדרישה או לא), אבל זה עדיין לא פתרון מתקבל..כי הפקונקציה הרקרוסיבית עצמה צריכה להחזיר לי 1 או 0...


#include <stdio.h>

int countDigits(int num)
{

if(num<10)

{

return 1;

}

return 1 + countDigits(num/10);

}

int checkDigits(int num, int numDigits)

{

if (num<10)

{



if ((numDigits%2)==0)

{

if ((num%2)==0)

{

return 1;

}

else

return 0;

}

else

if ((num%2)!=0)

{

return 1;

}

else

return 0;

}



return ((((checkDigits(num/10, numDigits-1)+checkDigits(num%10, numDigits)))));

}

#include <stdio.h>

int main()

{

int num=-1,result;

while (num<0)

{

printf("Please enter a positive number:\n");

scanf("%d", &num);

}


result=checkDigits(num,(countDigits(num)))/countDigits(num);

if (result==1)

printf("The number is valid.\n",(result));

else

printf("The number is not valid.\n",(result));

return 0;

}

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

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

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

מסורבל ולא מלוטש, אבל עובד ;D


#include <stdio.h>
int countDigits(int num)
/*isn't this code lovely, look how simple it is.*/
{
if(num<10)
{
return 1;
}
return 1 + countDigits(num/10);
}
int checkDigits(int num, int numDigits)
/*this one on the other hand will give you cancer, or at least a headache*/
{
if (num>9) /*this will go on until the last number*/
{
if ((numDigits%2)==0)
{
if (((num%10)%2)==0)/*the function will return zero with the first unfullfilled condition*/
{
return (checkDigits(num/10, numDigits-1));
}
else
return 0;
}
else
if (((num%10)%2)!=0)
{
return (checkDigits(num/10, numDigits-1));
}
else
return 0;
}
else /*the last number, there for, changing the return result*/
{
if ((numDigits%2)==0)
{
if (((num%10)%2)==0)
{
return 1;
}
else
return 0;
}
else
if (((num%10)%2)!=0)
{
return 1;
}
else
return 0;
}
}
#include <stdio.h>
int main()
{
int num=-1,result;
while (num<0)
{
printf("Please enter a positive number:\n");
scanf("%d", &num);
}
result=checkDigits(num,(countDigits(num)));
if (result==1)
printf("The number is valid.\n",(result));
else
printf("The number is not valid.\n",(result));
/*IT WORKS!*/
return 0;
}

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

אתה יכול לעשות את הקוד שלך הרבה יותר פשוט אם תשתמש בהרבה פחות ifים, ובמקום זה תשתמש בביטויים בוליאנים יותר מחוכמים (תחשוב - מתי בדיוק אתה מחזיר 0, ומתי לא?)

חוץ מזה, אתה יכול לפשט את הפונקציה אם תשנה קצת את תנאי העצירה שלך.

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

ארכיון

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

×
  • צור חדש...