פורסם 2005 בדצמבר 3019 שנים זה דיי פשוט אני רוצה לבדוק אם עשיתי טוב.- כתוב פונקציה רקורסיבית המקבלת מספר שלם n ומדפיסה את כל המספרים מ 1 עד n .int num(int n){if(n>0){printf("%d",n);return num(n-1);}זה ידפיס ננחי N=3 אז ידפיס 321. איך אני עושה שידפיס 123 ?
פורסם 2005 בדצמבר 3019 שנים כל מה שאתה צריך לעשות זה להחליף את סדר השורות של הקריאה הרקוריסיבית עם פקודת ההדפסה
פורסם 2005 בדצמבר 3019 שנים יש כמה דרכים, הראשונה: אלגנטית, מסובכת ודורשת ידע רחב ב continuations ומימושם ב c. אז נוותר על התענוג.השניה, פשוטה יותר, במקום שהפונקציה תקבל רק ארגומנט אחד שאותו היא תקטין היא תקבל שניים. (למקרה ויש הגבלה על החתימה אפשר פשוט שהיא תקרא לפונקציה ).האחד ישמש להדפסה ויתחיל מ1השני ישמש לתנאי העצירה ויהיה תמיד n.הדרך השלישית (שאליה כנראה התכוון המשורר) היא שהפונציה תדפיס את הקריאה הבאה שלה ותחזיר את ערך ה n הנוכחי משהו כמוprintf("%d",num(n-1));return n;מטי.
פורסם 2005 בדצמבר 3019 שנים אני לא מבין מה אתם מסבכים אותו הוא כתב כמעט נכון זהו הקוד הסופיvoid num(int n){ if(n > 0) num(n - 1); printf("%d",n);}ראיתי לנכון להסיר את ערך מוחזר מהפונקציה כי זה נראה לי חסר משמעותשים לב שפקודת ההדפסה מחוץ לתנאי, לכן רק כאשר כל הקריאות הרקורסיביות מתחילות לחזור מלמטה למעלה רק אז מתחילה ההדפסה ולכן יודפס מהמספר הקטן לגדול
פורסם 2005 בדצמבר 3119 שנים מחבר אני לא מבין מה אתם מסבכים אותו הוא כתב כמעט נכון זהו הקוד הסופיvoid num(int n){ if(n > 0) num(n - 1); printf("%d",n);}ראיתי לנכון להסיר את ערך מוחזר מהפונקציה כי זה נראה לי חסר משמעותשים לב שפקודת ההדפסה מחוץ לתנאי, לכן רק כאשר כל הקריאות הרקורסיביות מתחילות לחזור מלמטה למעלה רק אז מתחילה ההדפסה ולכן יודפס מהמספר הקטן לגדולתודה רבה לכולם באמת אחלה פורום איזה עזרה יש פה !!אבל באמת הדרך הכי קצרה שהבנתי זה זה שמעלי
פורסם 2005 בדצמבר 3119 שנים זו גם הדרך הכי נכונה מבחינה מקצועית.....בפונקציות הדפסה רקורסיביות לא צריך להחזיר כלום, ולא צריך שום כאב ראש כזה.... אפשר לעשות כמו שהמגיב הראשון המליץ.... הכי פשוט.....
פורסם 2005 בדצמבר 3119 שנים מחבר יש לי עוד שאלה:מקבלים כפרמטר מערך A שמכיל מספרים שלמים באורך N.אם NUM נימצא במערך הפונרציה מחזירה TRUE.כמובן שברקורסיה עושים את זה . ככה אני עשיתי:int or(int a[n], int num, int i){if(i<n)if(a[i]==num)printf("true");return or(i+1);}הנחה: I=0.עשיתי טוב?
פורסם 2005 בדצמבר 3119 שנים 1. לא יודע מה הדרך המקצועית לעשות את זה... אני בתעשיה רק שנתיים אז אולי יש לי עוד מה ללמוד.2. מה שכתבת לא טוב, אם המספר מופיע פעמיים (או יותר) אז true יודפס יותר מדי פעמים.לולא כל העצים בסביבה היה לי יותר נוח להפנות אותך ליער (רעיון) שהצגתי בתגובתי הראשונה - (השיטה השלישית), רעיון זה פותר בסיס רחב מאד של בעית מהסוג הנ"ל ואז נחסך ממך המאמץ לפתור כל בעיה אד-הוק.מטי.
פורסם 2005 בדצמבר 3119 שנים מחבר 2. מה שכתבת לא טוב, אם המספר מופיע פעמיים (או יותר) אז true יודפס יותר מדי פעמים.אממ אז בשביל שזה ידפיס פעם אחת אני צריך לעשות ככה:int or(int a[n], int num, int i){if(i<n)if(a[i]==num)return or(i+1);printf("true");}אבל זה נכון ככה? אין שגיאות או משהו?
פורסם 2005 בדצמבר 3119 שנים לא, כאן יש בעיה חמורה יותר. אם התנאי לא מולא באיטרציה הראשונה לא תתבצע קריאה רקורסיבית ואז פשוט יודפס true. זה לא מה שאתה מנסה להשיג.תחשוב על פונקציה שמחזירה ערך בוליאני (אמת/שקר 1/0 true/false) שהוא פעולת or בין תוצאת התנאי של האיטרציה הנוכחית עם התוצאת באיטרציות הקודמות.ההדפסה תתבצע רק אם ערך זה הוא true .מטי.
פורסם 2005 בדצמבר 3119 שנים מחבר לא, כאן יש בעיה חמורה יותר. אם התנאי לא מולא באיטרציה הראשונה לא תתבצע קריאה רקורסיבית ואז פשוט יודפס true. זה לא מה שאתה מנסה להשיג.תחשוב על פונקציה שמחזירה ערך בוליאני (אמת/שקר 1/0 true/false) שהוא פעולת or בין תוצאת התנאי של האיטרציה הנוכחית עם התוצאת באיטרציות הקודמות.ההדפסה תתבצע רק אם ערך זה הוא true .מטי.צודק בקשר לטעות שלי אבל לא הבנתי מה אתה מנסה להגיד... ???
פורסם 2005 בדצמבר 3119 שנים יש לי עוד שאלה:מקבלים כפרמטר מערך A שמכיל מספרים שלמים באורך N.אם NUM נימצא במערך הפונרציה מחזירה TRUE.כמובן שברקורסיה עושים את זה . ככה אני עשיתי:int or(int a[n], int num, int i){if(i<n)if(a[i]==num)printf("true");return or(i+1);}הנחה: I=0.עשיתי טוב?או קיי השאלה הזו פחות קלאסית לרקורסיה כי אפשר היה לעשות ע"י סריקה פשוטה של המערך בלולאה, אם בכל זאת היית רוצה לעשות אותה ברקורסיה להלן הקוד:bool FindThis(int arr[],int n,int i,int arrSize){ if(i < arrSize) { if(arr[i] == n) return true; else return FindThis(arr,n,i+1,arrSize); } else return false;}כאן להבדיל מהשאלה הראשונה אתה יכול לבצע את ההדפסה מחוץ לפונקציה כי בסוף אתה צריך להדפיס רק ערך סופי של הקריאה הראשונה לרקורסיהבשאלה הקודמת ההדפסה ניצלה למעשה את ההתנהגות של הרקורסיה כדי להדפיס כל קריאה שלה int arr[10] = {0,2,2,8,3,1,7,8,5,6}; printf("%d",FindThis(arr,5,0,10));
פורסם 2005 בדצמבר 3119 שנים 1. לא יודע מה הדרך המקצועית לעשות את זה... אני בתעשיה רק שנתיים אז אולי יש לי עוד מה ללמוד.בתעשיה נמנעים מלהשתמש ברקורסיות חוץ מאולי כשמטפלים בעצים קטנים (עצים או מבנים הררכיים קטנים) וזאת מטעמים של ביזבוז זכרון ואורך מחסנית. אני אומר את זה עם 7.5 שנים של ניסיון בתעשיה.
פורסם 2005 בדצמבר 3119 שנים איזו תעשיה אתם מדברים ? יש תעשיה ?מיי גוד , יש תעשיה ולא ידעתי וואלה אני מתחיל להתגעגע לימים שהיתי כותב ב- C הייתי כלי :ylsuper:
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.