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

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



  #1  
ישן 01-01-2012, 00:53
  CM0S CM0S אינו מחובר  
 
חבר מתאריך: 17.03.02
הודעות: 2,354
שאלה לגבי נכונות קוד ב-C (רקורסיה)

שלום לכולם,

קיבלתי תרגיל בית בנושא רקורסיה. פתרתי את התרגילים, כך שהשאלה שלי היא יותר נכונות מתמטית שבאה לידי ביטוי בקוד שכתבתי.

לדוגמה, בתרגיל הראשון התבקשתי לכתוב פונקציה רקורסיבית שמקבלת מספר ומחזירה את המְחַלְקִים הראשוניים שלו, מהגדול לקטן. זה הפתרון שלי:

קוד:
void printPrimeFactors(int num) { if(num == 1) return; else { int i; i = 2; while (num%i != 0) i++; cout<<i<<" "; printPrimeFactors(num/i); } }


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

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

מה דעתכם בנושא?

תודה
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 01-01-2012, 01:54
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 1 שנכתבה על ידי CM0S שמתחילה ב "שאלה לגבי נכונות קוד ב-C (רקורסיה)"

ציטוט:
במקור נכתב על ידי CM0S
לדוגמה, בתרגיל הראשון התבקשתי לכתוב פונקציה רקורסיבית שמקבלת מספר ומחזירה את המְחַלְקִים הראשוניים שלו, מהגדול לקטן. זה הפתרון שלי:
אני לא יודע אם ניסית להריץ את הקוד, אבל אתה מדפיס את המחלקים מהקטן לגדול ולא מהגדול לקטן...

דווקא כי אתה עובר על המספרים מהקטן לגדול, אין צורך בבדיקה שהמספר אכן ראשוני.
למה?
בוא נניח בשלילה שהמספר i אליו הגעת, אותו אתה מדפיס, שמחלק את num הוא פריק.
זה אומר שקיימים שני מספרים אחרים, j ו-k שהם המחלקים שלו, ו-j ו-k קטנים מ-i. (המחלקים של מספר קטנים ממנו...)
j ו-k, המחלקים של i הם כמובן גם מחלקים של num ולכאורה פספסת אותם...
אבל בוא נזכור שבדרך ל-i עברת על כל המספרים הקטנים ממנו החל מ-2, ולכן זה אומר שעברת גם על j ו-k.
מה שעומד בסתירה לכך שפספסת אותם...
מסקנה: מסתבר שהמספר שאתה מדפיס הוא ראשוני.

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

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 02-01-2012, 19:21
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 5 שנכתבה על ידי CM0S שמתחילה ב "אוקיי, מצויין. אני חייב לציין..."

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

אם במקרה היינו מדברים על שדה המספרים הטבעיים מודולו p, היינו בבעיה. קוד כזה הוא לא נכון:
קוד:
template<typename T> void printPrimeFactors(const T& num) { if(num == 1) return; else { T i = 2; while (num%i != 0) i++; cout<<i<<" "; printPrimeFactors(num/i); } }

כי יכול לדוגמה, בשדה [tex]Z_5[/tex] נגלה ש-[tex]3 \cdot 4 = 2[/tex] (כי [tex]3 \cdot 4 = 12[/tex] וכידוע [tex]12 \equiv 2 (mod 5)[/tex] כי השארית של חלוקה 12 ב-5 היא 2), ולכן [tex]{2 \over 3} = 4[/tex], כלומר, המחלקים של מספר יכולים להיות גדולים ממנו.
אם מישהו היה כותב במקרה מחלקה כזו (http://drdobbs.com/cpp/184401858) אי-אפשר היה לסמוך על הקוד.
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

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

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

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

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

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



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

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

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

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