פורסם 2012 בנובמבר 3013 שנים לאחרונה התבקשתי לכתוב פונקציה רקרוסיבית שעבור תנאים מסויימים מחזירה 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 אבל התבקשתי שההחזר יהיה תקין גם בפונקציה עצמה ולא רק בתוצאה הסופית...כל סוג של עזרה תתקבל בברכה...וסליחה על המלל הארוך
פורסם 2012 בנובמבר 3013 שנים הקוד שלך הרבה יותר מסורבל ממה שהוא צריך להיות.קודם כל, למה אתה עושה קריאה רקורסיבית פעמיים (פעם על הספרה התחתונה ופעם על שאר המספר)? את החישוב של הספרה התחתונה אתה פשוט יכול לבצע בחלק נפרד של הקוד באותה הפונקציה, בלי שום קריאה רקורסיבית.חוץ מזה, לא הבנתי - מספר הספרות נתון מראש? הפונקציה לא צריכה לחשב אותו תוך כדי ריצתה?נ.ב. אין צורך לציין בכותרת שאתה כותב ב-Visual Studio, זה לא רלוונטי לשאלה... (שהיא בעיה אלגוריתמית)
פורסם 2012 בנובמבר 3013 שנים מחבר לא יודע, זה מה שקפץ לי לראש וטכנית זה עבד אז הנחתי לזה...הקריאה הראשונה מפרקת את המספר לפחות ספרות והקריאה השנייה נותנת את הפתרון למספר הנוכחי בתור...לא קופץ לי פתרון אחר.חישוב הספרות מבוצע ע"י פונקציה אחרת שכתבתי, אז כן ניתן להניח שמספר הספרות נתון מראש אני אוסיף את הקוד המלא עם ה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;}
פורסם 2012 בנובמבר 3013 שנים אם הפונקציה checkDigits יודעת מראש את מספר הספרות, אז האלגוריתם נעשה משמעותית יותר קל. נניח לדוגמה שאתה יודע שמספר הספרות הוא 5 - אז זה אומר שספרת האחדות היא במיקום 5 (אי זוגי) ולכן צריכה להיות אי זוגית, ואם היא זוגית אז אתה יכול מיד להחזיר 0 ולצאת מהפונקציה, בלי שום קריאה רקורסיבית. אם היא אי זוגית אז אתה יכול להמשיך לבדוק ברקורסיה את שאר המספר. תחשוב איך אתה יכול לכתוב באמצעות זה את הפונקציה בצורה יותר פשוטה.
פורסם 2012 בנובמבר 3013 שנים מחבר וואוו, זה עבד, תודה רבה! הקוד לא נראה בהכרח יותר טוב עכשיו אבל הוא בהחלט עובד כמו שצריך שוב תודה!
פורסם 2012 בנובמבר 3013 שנים מחבר מסורבל ולא מלוטש, אבל עובד ;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;}
פורסם 2012 בנובמבר 3013 שנים אתה יכול לעשות את הקוד שלך הרבה יותר פשוט אם תשתמש בהרבה פחות ifים, ובמקום זה תשתמש בביטויים בוליאנים יותר מחוכמים (תחשוב - מתי בדיוק אתה מחזיר 0, ומתי לא?)חוץ מזה, אתה יכול לפשט את הפונקציה אם תשנה קצת את תנאי העצירה שלך.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.