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

שאלה בריקורסיה ב C צריך עזרה.


orgordin

Recommended Posts

זה דיי פשוט אני רוצה לבדוק אם עשיתי טוב.

- כתוב פונקציה רקורסיבית המקבלת מספר שלם n ומדפיסה את כל המספרים מ 1 עד n .

int num(int n)
{
if(n>0)
{
printf("%d",n);
return num(n-1);
}

זה ידפיס ננחי N=3 אז ידפיס 321. איך אני עושה שידפיס 123 ?

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

יש כמה דרכים, הראשונה: אלגנטית, מסובכת ודורשת ידע רחב ב continuations ומימושם ב c. אז נוותר על התענוג.

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

האחד ישמש להדפסה ויתחיל מ1

השני ישמש לתנאי העצירה ויהיה תמיד n.

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

printf("%d",num(n-1));

return n;

מטי.

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

אני לא מבין מה אתם מסבכים אותו הוא כתב כמעט נכון

זהו הקוד הסופי

void num(int n)
{
if(n > 0)
num(n - 1);
printf("%d",n);
}

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

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

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

אני לא מבין מה אתם מסבכים אותו הוא כתב כמעט נכון

זהו הקוד הסופי

void num(int n)
{
if(n > 0)
num(n - 1);
printf("%d",n);
}

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

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

תודה רבה לכולם באמת אחלה פורום איזה עזרה יש פה !!

אבל באמת הדרך הכי קצרה שהבנתי זה זה שמעלי

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

זו גם הדרך הכי נכונה מבחינה מקצועית.....

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

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

יש לי עוד שאלה:

מקבלים כפרמטר מערך 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.

עשיתי טוב?

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

1. לא יודע מה הדרך המקצועית לעשות את זה... אני בתעשיה רק שנתיים אז אולי יש לי עוד מה ללמוד.

2. מה שכתבת לא טוב, אם המספר מופיע פעמיים (או יותר) אז true יודפס יותר מדי פעמים.

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

מטי.

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

2. מה שכתבת לא טוב, אם המספר מופיע פעמיים (או יותר) אז true יודפס יותר מדי פעמים.

אממ אז בשביל שזה ידפיס פעם אחת אני צריך לעשות ככה:

int or(int a[n], int num, int i)
{
if(i<n)
if(a[i]==num)
return or(i+1);
printf("true");
}

אבל זה נכון ככה? אין שגיאות או משהו?

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

לא, כאן יש בעיה חמורה יותר.

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

תחשוב על פונקציה שמחזירה ערך בוליאני (אמת/שקר 1/0 true/false) שהוא פעולת or בין תוצאת התנאי של האיטרציה הנוכחית עם התוצאת באיטרציות הקודמות.

ההדפסה תתבצע רק אם ערך זה הוא true .

מטי.

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

לא, כאן יש בעיה חמורה יותר.

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

תחשוב על פונקציה שמחזירה ערך בוליאני (אמת/שקר 1/0 true/false) שהוא פעולת or בין תוצאת התנאי של האיטרציה הנוכחית עם התוצאת באיטרציות הקודמות.

ההדפסה תתבצע רק אם ערך זה הוא true .

מטי.

צודק בקשר לטעות שלי אבל לא הבנתי מה אתה מנסה להגיד... ???

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

יש לי עוד שאלה:

מקבלים כפרמטר מערך 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));

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

1. לא יודע מה הדרך המקצועית לעשות את זה... אני בתעשיה רק שנתיים אז אולי יש לי עוד מה ללמוד.

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

אני אומר את זה עם 7.5 שנים של ניסיון בתעשיה.

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

ארכיון

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

×
  • צור חדש...