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

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


matanyaniv

Recommended Posts

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

מישהו יכול לעזור לי לפתור את התרגיל הבא:(בשפת 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);
}

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

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

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

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

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

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

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

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

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

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

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

ארכיון

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

×
  • צור חדש...