כותב |
|
שימי אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 16 December 2007 בשעה 21:34 | | IP רשוּם
|
|
|
|
שלום. מישהו יכול בבקשה לעזור לי עם השאלה הבאה. זאת השאלה המפורסמת שצריך למצוא את תת המחזרות הארוכה ביותר של שתי מחרוזות. כמו כן, צריך לעשות את זה רק ברקורסיה, בלי שימוש בלולאות... אני יושב על זה כבר כמה ימים, אבל שום דבר לא צץ.
http://www.cs.bgu.ac.il/~prog081/assignments/assignment4/ass4.doc
זאת שאלה 8, האחרונה.
אני באמת כבר על סף יאוש, השאלה הזאת יצאה לי כבר מכל החורים. באמת תודה מראש לכל התגובות. שימי.
|
חזרה לתחילת העמוד |
|
|
11010010110 פורומיסט על
הצטרף / הצטרפה: 23 April 2006
משתמש: מנותק/ת הודעות: 2621
|
נשלח בתאריך: 17 December 2007 בשעה 20:02 | | IP רשוּם
|
|
|
|
קוד:
# include <stdio.h>
# define S "abddrgty" # define T "cdedrgrt"
unsigned long long int f (int x ,int y, int n) ; unsigned long long int c (unsigned long long int i) ; unsigned long long int d (unsigned long long int n ,unsigned long long int m) ; void w (int x ,int y, unsigned long long int m) ;
int main ( )
{ w (0, 0, c (f (0 ,0, 0))) ; return 1 ; }
unsigned long long int f (int x ,int y, int n) { if (T [x] == S [y]) { if ((T [x + 1] == '\0') || (S [y + 1] == '\0')) return d (n + 1 ,1) ; return f (x + 1 ,y + 1 ,n + 1) ; } else { int t = 0 ; int s = 0 ; int v ; int u ; if (T [x + 1] != '\0') t = f (x + 1 ,y ,n) ; if (S [y + 1] != '\0') s = f (x ,y + 1 ,n) ; if ((T [x + 1] == '\0') && (S [y + 1] == '\0')) return d (n ,1) ; v = c (t / 2) ; u = c (s / 2) ; return d (v * !(v < u) + u * (v < u) ,2 * c (t) * !(v < u) + (2 * c (s) + 1) * (v < u)) ; } }
void w (int x ,int y, unsigned long long int m) { if (!m) { printf ("\n\n") ; return ; } if (T [x] == S [y]) { printf ("%c" ,T [x]) ; w (x + 1, y + 1, m) ; } else w (x + !(m % 2) ,y + m % 2 ,m / 2) ; return ; }
unsigned long long int d (unsigned long long int n ,unsigned long long int m) { if (!n && !m) return 0 ; return (d (n / 2 ,m / 2) * 4 + n % 2 * 2 + m % 2) ; }
unsigned long long int c (unsigned long long int i) { if (!i) return 0 ; return (c (i / 4) * 2 + i % 2) ; } |
|
|
אל תשלח אותי בפעם הבאה לקובץ שלא בהכרח יש לי אם מה לפתוח אותו. אפשר להעתיק את השאלה לפורום
|
חזרה לתחילת העמוד |
|
|
באמת תודה אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 17 December 2007 בשעה 20:47 | | IP רשוּם
|
|
|
|
בקשר לקובץ, ניסיתי להעתיק את השאלה אבל היא באה עם תמונות שרלוונטיות לשאלה כמו שאתה יכול לראות בקובץ DOC. עוד משהו, מה זה הunsigned long הזה, יש מצב להחליף אותו במשתנה מסוג אחר, כי עוד לא למדנו מה זה unsigned ואני לא בטוח אם יאשרו את זה. באמת באמת באמת תודה. זה ללא ספק הפורם השולט באינטרנט לתכנות.
|
חזרה לתחילת העמוד |
|
|
11010010110 פורומיסט על
הצטרף / הצטרפה: 23 April 2006
משתמש: מנותק/ת הודעות: 2621
|
נשלח בתאריך: 17 December 2007 בשעה 21:15 | | IP רשוּם
|
|
|
|
ניתן לפתור את זה גם על ידיי מערכים ואז אין צורך במשתנים
שהם לא int
ה unsigned long long int הוא המשתנה שיכול להחזיק את
המס' החיובי הגדול ביותר ב C (שאני יודע עליו)
במשתנה קטן יותר התוכנית תיתן תוצאות שגויות או תקרוס ב
strings ארוכים כי יהיו overflows
ועדיין היית יכול לעלות את התמונות ל hozt או משהוא ולא
להכריח אותי ללכת למחשב השני כולה כדיי לפתוח קובץ
|
חזרה לתחילת העמוד |
|
|
שימי אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 17 December 2007 בשעה 22:01 | | IP רשוּם
|
|
|
|
מה זה hozt?
שימוש במערכים די מסבך את זה, לא? מה הפונקציות אמורות להחזיר? מצביעים?
שוב תודה.
|
חזרה לתחילת העמוד |
|
|
11010010110 פורומיסט על
הצטרף / הצטרפה: 23 April 2006
משתמש: מנותק/ת הודעות: 2621
|
נשלח בתאריך: 17 December 2007 בשעה 22:11 | | IP רשוּם
|
|
|
|
http://www.hozt.net
תסתכל ותנסה להבין איך התוכנית ללא מערכים עובדת ותחשוב
איך מממשים את זה אם מערכים
|
חזרה לתחילת העמוד |
|
|
שימי אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 18 December 2007 בשעה 14:43 | | IP רשוּם
|
|
|
|
יאלה הרקורסיה הזאת!! ישבתי איזה שעה על התוכנית הזאת ועדיין זה לא ברור לי, יש דרך לעקוב אחרי מה שהולך פה ואחרי רקורסיה בכללי? זה ממש מסובך לי ואני באמת לא מבין איך אני יכול לשלב פה עוד מערכים...? אפשר עוד קצת עזרה בבקשה? כמו כן, העלתי את השאלה לhozt ככה שכולם יוכלו לראות.
שוב תודה מראש. שימי.
|
חזרה לתחילת העמוד |
|
|
שימי אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 19 December 2007 בשעה 07:41 | | IP רשוּם
|
|
|
|
11010010110, אתה יכול לעזור לי בבקשה?
|
חזרה לתחילת העמוד |
|
|
שימי אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 19 December 2007 בשעה 14:45 | | IP רשוּם
|
|
|
|
טוב, אז איכשהו, בניתי את הדבר הבא:
קוד:
# include <stdio.h>
void lcs(char st1[], char st2[], char temp[], int x, int y);
int main(){ char st1[] = "bcdab", st2[] = "abcd", temp[20]; lcs(st1, st2, temp, 0, 0); }
void lcs(char st1[], char st2[], char temp[], int x, int y){ static int i, y1; if (st1[x] == st2[y]){ temp = st1[x]; i++; y1 =y + 1; if ((st1[x + 1] != 0) && (st2[y + 1] != 0)) lcs (st1, st2, temp, x + 1, y + 1); } else { if (st2[y + 1] != 0){ lcs (st1, st2, temp, x, y + 1); return; } if (st1[x + 1] != 0){ lcs (st1, st2, temp, x + 1, y1); return; } }
|
|
|
הרצתי אותה על כמה וכמה מקרים, אולם אני עדיין פוחד שיש פה באגים שאני לא מוצא כיוון שהיא ממש ממש פשוטה כמו שאתם יכולים לראות. מישהו יכול לאשר לי שהיא בסדר ולא פספסתי משהו?
תודה מראש. שימי.
}
|
חזרה לתחילת העמוד |
|
|
שימי אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 19 December 2007 בשעה 16:49 | | IP רשוּם
|
|
|
|
טוב, תשכחו מהקוד הקודם, הוא לא טוב. איך זה נראה לכם (תשכחו מיעילות):
קוד:
# include <stdio.h> # include <string.h>
#define MAX 20
void lcs(char st1[], char st2[], char temp[], char biggest[], int x, int y, int i, int y1, int j); void compare(char biggest[], char temp[]); void reset(char temp[], int i);
int main(){ char st1[MAX] = {0}, st2[MAX] = {0}, temp[MAX] = {0}, biggest1[MAX] = {0}, biggest2[MAX] = {0}; printf("Enter First String:"); gets(st1); printf("Enter Second String:"); gets(st2); lcs(st1, st2, temp, biggest1, 0, 0, 0, 0, 1); lcs(st2, st1, temp, biggest2, 0, 0, 0, 0, 1); printf("The LCS is:"); if ((strlen(biggest1)) > (strlen(biggest2))) puts(biggest1); else puts(biggest2); }
void lcs(char st1[], char st2[], char temp[], char biggest[], int x, int y, int i, int y1, int j){ if (st1[x] == st2[y]){ temp = st1[x]; i++; y1 =y + 1; if ((st1[x + 1] != 0) && (st2[y + 1] != 0)){ lcs (st1, st2, temp, biggest, x + 1, y + 1, i, y1, j); return; } } else { if (st2[y + 1] != 0){ lcs (st1, st2, temp, biggest, x, y + 1, i, y1, j); return; } if (st1[x] != 0){ lcs (st1, st2, temp, biggest, x + 1, y1, i, y1, j); return; } } compare(biggest, temp); if (st1[j] != 0) lcs (st1, st2, temp, biggest, j, 0, 0, 0, j + 1); }
void compare(char biggest[], char temp[]){ if ((strlen(temp)) > (strlen(biggest))) strcpy(biggest, temp); reset(temp, 0); }
void reset(char temp[], int i){ if (i <= MAX){ temp = 0; reset(temp, i + 1); } }
|
|
|
|
חזרה לתחילת העמוד |
|
|
|
|