עבור לתוכן

שאלה בשפת C - רקורסיה(?)

Featured Replies

פורסם

התחלנו ללמוד פונקציות שבתוך הפונקציה יש זימון לפונקציה עצמה ואני לא ממש מבין את זה.

מישהו יכול לעזור לי לפתור את התרגיל הבא:(בשפת C)

*******

*****

***

*

***

*****

*******

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

תודה.

פורסם

אתה רוצה פתרון, או הסבר איך לפתור?

פורסם
  • מחבר

פתרון עם הסבר קצר יעזור לי מאוד (אם אתה יכול).

פורסם

void func(int n)
{
int i;
if(n<=0)
return;
for(i=0;i<n;i++)
printf("*");
printf("\n");
func(n-2);
for(i=0;i<n;i++)
printf("*");
printf("\n");

}

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

פורסם

הנה תוכנית דומה, רק שהיא מציירת מספרים

#include <stdio.h>
#include <conio.h>
void repet(int n, int a)
{
int i;
for (i=0 ; i<a-n ; i++)
printf (" ");
for (i=0 ; i<n ; i++)
{
printf("%d ",n);
}
printf("\n");
}
void holl (int n,int a)
{
int i;
if (n==1)
repet(n,a);
else
{
repet(n,a);
holl(n-1,a);
repet(n,a);
}
}
int main()
{
int n;
scanf("%d",&n);
holl(n,n);
getch();
return 0;
}

פורסם

namespace ConsoleApplication1
{
class Program
{
private static void test1(int s,int n)
{
for (int i = 0; i < s; i++)
Console.Write(" ");
for (int i = 0; i < n; i++)
Console.Write("*");
for (int i = 0; i < s; i++)
Console.Write(" ");
if (n > 2)
{
Console.WriteLine();
test1(s + 1, n - 2);
}
Console.WriteLine();
for (int i = 0; i < s; i++)
Console.Write(" ");
for (int i = 0; i < n; i++)
Console.Write("*");
for (int i = 0; i < s; i++)
Console.Write(" ");
}

static void Main(string[] args)
{
test1(0,21);
Console.ReadLine();
}
}
}

UnsignedInteger התכנית שלך לא מציירת את השורות ממורכזות בצורה של משפך

פורסם

נכון, ואם היית קורא את הטקסט שרשמתי מתחת לקוד, היית מבין למה.

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

עכשיו כשאני קורא את הקוד שלך, למה ציירת עוד רווחים אחרי הכוכבית?

בנוסף בלי קשר, אם רוצים שהלוגיקה תהייה קצת יותר נכונה, צריך לשלוח unsigned.

פורסם

כן במקרה של רווחים ת'צודק , אצלי במקור היה תרגיל של לצייר $ על רקע של 0 בגלל זה

תגידו אם כבר מדברים על רקורסיות באיזה איטרציה התכנית הבאה קורסת אצלכם על StackOverfkow

אצלי הגעתי 119,861

    private static void test2(int n)
{
Console.WriteLine(n);
test2(n + 1);
}

פורסם

תכתוב לקובץ הרבה אפסים ותראה מתי התוכנית קורסת. אצלי זה קרה ב1GB(כנראה מגבלה של WIN).

פורסם
  • מחבר

UnsignedInteger תודה על הפתרון, Banana אין לי מושג למה אבל התוכנית שכתבת לא עובדת אצלי...

הבנתי איך זה עובד, מישהו יודע רק איך אני עושה שכוכבית אחת תופיע פעם אחת במקום פעמיים?

פורסם

לדעתי אתה חייב לשלוח שני משתנים, או לעשות פונקציית "ממשק" שקוראת לפונקציה אחרת שמקבלת 2 משתנים.

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

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

פורסם

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

פורסם

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

לכן, חייבים להעביר גם את הנתון הזה (כאשר בהתחלה הוא 0, ועולה כל פעם ב-1).

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

עריכה: עכשיו הבנתי שענית בכלל על הנושא של 2 כוכביות ברצף... בכל מקרה, אם הדרישה היא שזה ייראה ככה, אפשר להעביר מספר שרק מייצג את מספר הכוכביות, וכדי לקבל את המספר האמיתי כופלים אותו ב-2 ומוסיפים 1. ואז מחסירים מהמספר הזה 1 בכל פעם.

אבל אני מסכים שכנראה הכוונה היא שיהיו 2 כוכביות בסוף במספר זוגי.

ארכיון

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

דיונים חדשים