מספרים פראיים - עצירת לולאה

היי,

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

יש שלשה מצבים (לפחות ממה שאני הצלחתי להבין).

  1. מצב בו הגנרייטור מכיל בתוכו לולואה אינסופית - ואז ה"תנאי עצירה" שלו הוא מחוץ לגנרייטור עצמו
    באמצעות לולאה for עם טווח range או לחילופין while עם תנאי עצירה כלשהו. כל זימון יבוצע עם הפונקציה next

  2. גנרייטור שרץ בלולאה פור כ generator iterable כלומר, אנחנו מכניסים ללולאת הפור את הגנרייטור עצמו (כמו להכניס for שירוץ על רשימה לצורך העניין)
    במצב זה אין לנו צורך בפונקציה next ו הגנרייטור ירוץ עד שהוא מגיע לסופו - כלומר בתוכו הוא מגיע לאיזה שהוא סוף (יש לו תנאי עצירה בתוך הפונקציה).

  3. מצב 2 כאשר בתוך הגנרייטור יש לולאה אינסופית - אנו ניכנס למצב של לולאה אינסופית. ממצב זה צריך להימנע.

גנרטורים יכולים אמנם לרוץ עד אינסוף, למשל אם יש בהם לולאה while True, אבל ממש כמו שבפונקציה רגילה שאינה גנרטור היית רוצה לעצור אחרי שמצאת את כל הגורמים של המספר, גם כאן עלייך למצוא את התנאי שיגיד "מצאת את כל הגורמים, עצור. יש הרבה אפשרויות לשחק עם זה ולמצוא תנאים - חלקם יעילים יותר וחלקם פחות (כלומר, חלקם יעצרו את הריצה שלך ברגע שסיימת וחלקם ימשיכו לרוץ עוד קצת למרות שאין עוד מה לחפש).
אם נושא הגנרטורים אינו אינטואיטיבי לך נסי להבין איך היית עושה זאת אם היה מדובר בפונקציה שמחזירה רשימה של המספרים הללו - ולא בגנרטור - ונסי להחיל את תנאי העצירה על הגנרטור.

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

אם הוא ממשיך לרוץ זה אומר שהוא בלולאה שלא מפסיקה לרוץ… כלומר אין לו תנאי עצירה.
יכול להיות שכשאשר הוא מגיע למספר שאתה רוצה הוא מציג תוצאה אבל זה לא אומר שהוא מפסיק להריץ אותו.

ממליץ לעבוד ידנית על המספר n - 1 עד n + 1 ולראות מה קורה.

מנצלת ת’רד קיים לשאלות נוספות (קשורות יותר וקשורות פחות)

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

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

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

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