בעייה בשפת c ריקורסיה - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

בעייה בשפת c ריקורסיה


ruli yeret

Recommended Posts

לא נאמר ולו פעם אחת איך מתבצעת פעולת הקלט. למה אתה כל כך בטוח שצריך דרך כזו או אחרת? בכל מקרה קל לשנות טיפה את הקוד בשביל שיעבוד עבור שיטה אחרת של קבלת קלט. מה הקטע של ה-time-out? מי צריך את זה בכלל? להזכירך סוף הרשימה==EOF==תו ספציפי שמעיד על סוף קבלת הקלט... שזה בדיוק מה שהצעתי.

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

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

באמת שאני לא מבין את ההתעקשות הזו.

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

הנה שרבטתי משהו:

#include <stdio.h>
int bull()
{
char a='0';
a=getchar();
return(a=='0' ? 0 : 1 + bull());
}




int main()
{
int m=0;
m=bull();
printf("%d Characters before the first 0",m);
return(0);
}


רץ לי יפה מאוד.

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

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

לא נאמר בשום מקום מעל איזו קבוצה הוא רוצה את המקדמים שלו... אולי הוא רוצה מעל R ואז בכלל אי אפשר על מחשב? :)

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

חוץ מזה, ספציפית את הפולינום שאתה בחרת אפשר לממש... הבחירה שלי ב-0 היתה שרירותית פה לגמרי כי אין חשיבות לתווים. בוחרים למשל את התו ~ בתור התו לסיום הקלט, ואז מזינים 5001~ וזה ירוץ ויחשב את הפולינום שלך.

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

צריך לקלוט מהמשתמש את המקדם של הפולינום ואת הערך של x

למשל: עבור הפולינום הקלט יהיה 2 0 13 1- 3

שימו לב: המספר הראשון הוא של החזקה הנמוכה! יש 0 במקום שבו אין חזקה !

התוכנית תציב את המספר להצבה מסעיף ב בתוך הפולינום ותפלוט את תוצאת ההצבה.

בריקורסיה אשמח לקבל עזרה

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

וזה לא תמונה זה פולינום אך הוא לא נשלח...2x^4+13x^2-x+3

הוא קיבל את הפולינום 2x^4+13x^2-x+3

והקלט שלו הוא - 2 0 13 1- 3

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

שנית, אם לא הבנת הוא לא קובע מה הקלט!

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

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

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

אפשר לדעת למה אנחנו מתווכחים עדיין על הקלט תוך-כדי-רקורסיה שכבר אמרתי שלא הכרחי למימוש האלגוריתם שהצעתי?

ענייני "איך יתבצע הקלט בדיוק" עד הפרטים הקטנים הם עניין שפותח הדיון יסתדר איתו. אני לא יודע איך זה יתבצע (הוא לא אמר משהו ברור, וגם מה שהוא כתב כקלט לא מובן: יוזן מקובץ טקסט בדיוק באופן שהוא הציג? זה לא הוסבר), ולכן אני מציע את האלגוריתם בהתייחס לצורת הזנת קלט מסויימת שנראית סבירה.

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

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

רק שזה מסובך לדעתי יותר מאשר להוציא את הנתונים למערך לפי מספר הארגומנטים בקלט

ולהזין לרקורסיה בכל שלב מערך קטן ב-1 ואת הגודל שלו כפרמטרים.

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

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

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

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

ארכיון

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

×
  • צור חדש...