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

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



  #1  
ישן 30-12-2011, 10:27
  assaf tolko assaf tolko אינו מחובר  
 
חבר מתאריך: 25.06.06
הודעות: 1,261
שאלה על מערכים ב-C

אני קצת מיואש, לכן אשמח לעזרה בנושא.

צירפתי תמונה עם השאלה במלואהhttps://2011-uploaded.fresh.co.il/2...30/18864874.jpg


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

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

תודה מראש לכל מי שמקדיש מזמנו.

נערך לאחרונה ע"י assaf tolko בתאריך 30-12-2011 בשעה 10:31.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 01-01-2012, 12:52
  עשהאלר עשהאלר אינו מחובר  
 
חבר מתאריך: 02.03.06
הודעות: 481
הסברים
בתגובה להודעה מספר 9 שנכתבה על ידי assaf tolko שמתחילה ב "אז זהו שלא... אין לי שום ידע..."

בס"ד

אם כן, הסברים:
קוד:
int find_sub_sequence(int *arr,int *sub,int size,int sum)

זהה בדיוק ל:
קוד:
int find_sub_sequence(int arr[],int sub[],int size,int sum)


קטע הקוד הבא:
קוד:
if (!sum) return 1; if (!size) return 0;

בודק (כמו שהסברתי קודם) אם הסכום המבוקש הוא 0, ואם כן מחזיר 1. (כי יש סכום כזה - הסכום הריק).
אח"כ, בודקים אם גודל המערך הוא 0, ואם כן מחזירים 0. (כי אין איברים, ולכן הסכום האפשרי היחיד הוא 0).
אלה בעצם תנאי העצירה של הרקורסיה.
שתי השורות הבאות יותר מסובכות. הן מהוות את הרקורסיה.
הביטוי arr+1 הוא בעצם הזנב של arr, שמתחיל מהאיבר השני. (כשתלמד מצביעים תבין את זה יותר לעומק).
באופן דומה, sub+1 הוא הזנב של sub, שמתחיל מהאיבר השני.
הביטוי
קוד:
*arr
הוא האיבר הראשון של arr. בדיוק כמו
קוד:
arr[0]


הרעיון של הרקורסיה הוא כזה:
נניח (לדוגמא) שהסכום המבוקש הוא 60, והאיבר הנוכחי הוא 21.
אזי, יש 2 אפשרויות לקבלת הסכום - סכום שכולל את האיבר הנוכחי, או סכום שלא כולל אותו.
כלומר, אם יש באיברים הבאים סכום של 60 או של 39.
הקריאה הרקורסיבית הראשונה בודקת 60, והקריאה השנייה בודקת 39.
אם יש סכום שלא כולל את האיבר הזה (60 בדוגמא), מספיק להחזיר 1.
אם יש סכום שכולל את האיבר הזה (39), צריך לסמן במקום המתאים ב-sub, ואז להחזיר 1.
זה מה שעושה הפקודה
קוד:
return *sub=1;

היא (כמעט) זהה לבלוק:
קוד:
{ sub[0]=1; return 1; }


ולסיום, אם לא מצאנו סכום מתאים, מחזירים 0.

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

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

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

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

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



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

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

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

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