עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Featured Replies

פורסם

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

- כתוב פונקציה רקורסיבית המקבלת מספר שלם 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 שנים של ניסיון בתעשיה.

פורסם

איזו תעשיה אתם מדברים ? יש תעשיה ?

מיי גוד , יש תעשיה ולא ידעתי 

וואלה אני מתחיל להתגעגע לימים שהיתי כותב ב- C הייתי כלי :ylsuper:

ארכיון

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

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.