לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #4  
ישן 15-12-2007, 19:58
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 3 שנכתבה על ידי vladikpri שמתחילה ב "אין לי מושג איך מתחילים..."

תחשוב על זה כעל בעיה קומבינטורית:
איך בונים את כל הווקטורים הבינאריים באורך n עם k אחדים כך שבין כל זוג אחדים יש לפחות אפס אחד?

בוא נחשוב על תהליך רקורסיבי הגיוני:
כדי להתחיל להגדיר רקורסיה, אתה צריך לחשוב על איך הבעיה הראשית נפתרת ע"י אותה הבעיה בדיוק בתנאים שונים?

אם אני רוצה להרכיב ווקטור כנ"ל עם פרמטרים n,k מה אני עושה?
התשובה היא: אני מחלק ל-2 אפשרויות:
1) הווקטור שלי מתחיל ב-0
2) הווקטור שלי מתחיל ב-10

אם הווקטור שלי מתחיל ב-0, חזרתי לבעיה של להרכיב ווקטור באורך n-1 עם k אחדים
אם הווקטור שלי מתחיל ב-10, עברתי לבעיה של להרכיב ווקטור באורך n-2 (אל תשכח שיחד עם האחד אתה גם קובע מיד אפס) עם k-1 אחדים.

מתי אתה עוצר?
כאשר n=0, לדוגמא, ואז אתה מדפיס את הווקטור שקיבלת.
======================================

עכשיו קצת פרטי מימוש:
אתה זקוק לפונק' שתפעיל לך את הרקורסיה. פה, אין ברירה. את העבודה הזו אתה יכול להשאיר גם למשתמש החיצוני, או לבנות פונק' מעטפת שתפעיל את הרקורסיה.
הרקורסיה שלך צריכה לקבל מערך בגודל של n לפחות (ה-n הראשון).
הרקורסיה נעה עם 3 פרמטרים:
1) המערך שקיבלת (מערך של сhar) שיש בו מספיק מקום להכיל את הטקסט שלך..
2) פרמטר n
3) פרמטר k.

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

זכור שכשמתקבל תנאי העצירה, אתה לא רק חוזר אחורה, אלא גם בודק ש-k=0 ואם כן מדפיס!
זכור שבכל זימון רקורסיבי, אתה משנה את התא המתאים במערך שלך פעמים, פעם ע"י הכנסה של 1 ואחריו אפס, ופעם ע"י הכנסה של אפס.

טוב, זה כבר כמעט כל הפתרון..
תקרא כמה פעמים, תבין מה ניסיתי לאמר פה.

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


נערך לאחרונה ע"י Dark Knight בתאריך 15-12-2007 בשעה 20:01.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 16-12-2007, 00:25
  Dark Knight Dark Knight אינו מחובר  
 
חבר מתאריך: 30.07.05
הודעות: 949
שלח הודעה דרך ICQ אל Dark Knight
בתגובה להודעה מספר 9 שנכתבה על ידי vladikpri שמתחילה ב "לא מצליח אולי מישהו בכל זאת..."

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

מכל זה, מה שאתה באמת צריך זה רק הפונק' הראשונה...
התוכנית באה רק בשביל שאני אוכל לבדוק, ופונק' המעטפת כי ככה אני מאמין שזה צריך להיות.

קוד:
#include <stdio.h> #include <stdlib.h> void sort_r(char arr[], int cur_index, int n, int k) { if (n == 0) { /* Stopping condition */ if (k == 0) { /* This makes sure we have a legal combination */ int i; for (i = 0; i < cur_index; ++i) { printf("%c", arr[i]); } printf("\n"); /* Line down between every combination */ } return; } /* Lets get to work then... */ arr[cur_index] = '0'; /* Assume first is zero */ sort_r(arr, cur_index +1, n - 1, k); /* len-1, same amount of students */ arr[cur_index] = '1'; /* Assume first is one [Notice we overwrite the 0] */ if (n > 1) { /* This IF comes to prevent overflow... */ arr[cur_index + 1] = '0'; /* Make sure we keep a break of 1 seat.. */ sort_r(arr, cur_index + 2, n - 2, k - 1); /* len - 2 (we took 2 seats now), students -1 */ } else { sort_r(arr, cur_index + 1, n - 1, k - 1); } } void sort_students(int n, int k) { /* This functions purpose in life is to properly start our recurssion. * This function doesn't have to exist, however, I recommend it... */ char* arr = (char*)malloc(n*sizeof(char)); /* Dynamic allocation, you don't have to use it, I guess */ if (arr == NULL) { exit(1); /* If allocation fails, exit */ } sort_r(arr, 0, n, k); free(arr); } int main(void) { int n,k; printf("Please enter the number of tables(n): "); scanf("%d", &n); printf("Please enter the number of students(k): "); scanf("%d", &k); printf("____ Here go the cominations: ____\n"); sort_students(n,k); system("pause"); /* Stop before closing the consol window... */ return 0; }
_____________________________________
חתימתכם הוסרה כיוון שלא עמדה בחוקי האתר. לפרטים נוספים לחצו כאן. תוכלו לקבל עזרה להתאמת החתימה לחוקים בפורום חתימות וצלמיות.

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:16

הדף נוצר ב 0.07 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר