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

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



  #3  
ישן 31-07-2010, 23:36
צלמית המשתמש של MatiM
  משתמש זכר MatiM MatiM אינו מחובר  
 
חבר מתאריך: 12.04.06
הודעות: 2,021
שלח הודעה דרך MSN אל MatiM
בתגובה להודעה מספר 2 שנכתבה על ידי High_Hopes שמתחילה ב "ממליץ על המאמר..."

עריכה: תשכחו מההודעה הזאת


לא יכלו להדגיש קצת את השורה הבאה:
ציטוט:
אנו רוצים למלא שוב בצבע אדום מהמרכז לכל עבר, עד לגבולות השחורים.


?!?!?!

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


ועדיין, למרות צדקתי בחשיבה שלי - אני לא מסתדר עם רקורסיות, וקראתי את הקישורים והמאמרים שפורסמו כאן [ובתתי קישורים, בנענע וכו'.....]



----------------------------------------------------



קראתי את המאמר הזה ואני לא מצליח להבין את הלוח-פיקסלים הזה.
(לא ניסיתי פיזית להדפיס ולצבוע חחח)

נניח שהגענו למשבצת הלבנה השניה מימין, בשורה השניה מלמטה.

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


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



מה פיספסתי?


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


נערך לאחרונה ע"י MatiM בתאריך 31-07-2010 בשעה 23:43.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 31-07-2010, 23:57
צלמית המשתמש של High_Hopes
  משתמש זכר High_Hopes High_Hopes אינו מחובר  
 
חבר מתאריך: 30.05.02
הודעות: 8,838
בתגובה להודעה מספר 3 שנכתבה על ידי MatiM שמתחילה ב "..."

ההודעה נכתבה לפני שראיתי שערכת...
============================

אתה לא אמור להגיע לשלושת המשבצות למטה, זה בידיוק הרעיון.

תחשוב שנייה על תוכנת הצייר שיש לך, נניח שאתה מצייר שמש עם קו שחור, עכשיו אתה רוצה לצבוע אותה בצהוב, אתה רוצה שרק מה שבתוך הקווים השחורים יצבע בצהוב, אתה לא רוצה שהשמיים גם יהיו צהובים.

הנה דוגמא:
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
ציירתי את העיגול השחור, שים לב לחץ האדום, באזור הזה בכוונה דאגתי שהקו השחור "יחתך" הקו לא נמצא מעל ההמשך שלו, או לצד ההמשך, אלא באלכסון, כשצבעתי את השמש בצהוב הצבע ידע לא לעבור את הקו הזה. זה בידיוק מה שאתה רואה בתמונה. האלגוריתם בכתבה עושה את אותו הדבר - מנקודת המוצא שאותה אתה בוחר הוא בונה 4 פונקציות חדשות - אחת בודקת את מה שמעליו, אחת את מה שמתחתיו, אחת את מה שמשמאלו ואחת מימינו, כל פונקציה כזאת בודקת אם הנקודה שהיא עומדת עליה לא צהובה ולא שחורה, ואז היא צובעת את הנקודה בצהוב ומפעילה שוב את ארבעת הפונקציות אחרת היא יוצאת.
אם היינו בודקים גם את האלכסון אז גם השמיים היו נצבעים בצהוב.*
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
הגלריה שלי בפליקר

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 24-07-2010, 19:51
צלמית המשתמש של hellfrost
  hellfrost hellfrost אינו מחובר  
 
חבר מתאריך: 07.12.09
הודעות: 7,072
בתגובה להודעה מספר 1 שנכתבה על ידי BigBrother שמתחילה ב "איך אני מבין רקורסיה ?"

אני הבנתי רקורסיה בעזרת מיון איחוד (Merge sort )

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

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

או בפסודו קוד:
קוד PHP:
 function Array MergeSort(Array A)
  
A1 A.SubArray(0A.Length 2);
  
A2 A.SubArray(A.Length 2A.Length);

  return 
Merge(MergeSort(A1),MergeSort(A2));


function Array 
Merge(Array A, Array B)
  
int AIndex 0;
  
int BIndex 0
  Vector result 
= new Vector();

  if (
A[AIndex] > B[BIndex])
    
result.push_back(A[AIndex++]);
  else
    
result.push_back(B[BIndex++]);

// Obviously one could be longer then the other and you need to handle that too....
 
  
return result.ToArray(); 
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #13  
ישן 31-07-2010, 16:50
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 12 שנכתבה על ידי BigBrother שמתחילה ב "דווקא אחלה מאמר , לגבי עזר או..."

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

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

אי אפשר לשלוח בריקורסיה משתנים שיהיו זהים בערכם בכל פעם כי אז תכנס ללולאה אינסופית.

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

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

ככה אני הבנתי את זה, בכל מקרה...
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #19  
ישן 18-08-2010, 08:18
  The_Equivocator The_Equivocator אינו מחובר  
 
חבר מתאריך: 11.02.04
הודעות: 16,543
בתגובה להודעה מספר 18 שנכתבה על ידי hellfrost שמתחילה ב "אני רק רוצה לציין שני..."

1) טענה מאוד מעניינת..(לגבי פיבנאצי).

תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

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

דוגמה קלאסית היא תשובה לשאלה האם המערך(של ממשיים\שלמים) כולל איברים שסכומם הכולל בדיוק K

תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

במקרה זה משתמשים בעובדה שכל תת קבוצה מורכבת מאיבר שלוקחים או לא לוקחים מקבוצת האם.

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

תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה


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


אם אתה אומר.. אני לא מכיר את הנושא.

נערך לאחרונה ע"י The_Equivocator בתאריך 18-08-2010 בשעה 08:45.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #20  
ישן 18-08-2010, 11:30
צלמית המשתמש של hellfrost
  hellfrost hellfrost אינו מחובר  
 
חבר מתאריך: 07.12.09
הודעות: 7,072
בתגובה להודעה מספר 19 שנכתבה על ידי The_Equivocator שמתחילה ב "1) טענה מאוד מעניינת..(לגבי..."

1. חוכמולוג שורש 5.... גם כן מספר....

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

אתה יודע איך נראה קוד של מיון מיזוג בC ?
ככה הוא נראה בשפה פונקציונאלית

קוד PHP:
 (defun merge-sort (list)
  (if (
small list) list
      (
merge-lists
        
(merge-sort (left-half list))
        (
merge-sort (right-half list))))) 


אתה צריך עוד את Small
קוד PHP:
 (defun small (list)
  (or (
null list) (null (cdr list)))) 


ואת המיזוג
קוד PHP:
 (defun merge-lists (list1 list2)
  (
merge 'list list1 list2 #'<)) 


וזה חוצה רשימות לשניים
קוד PHP:
 (defun right-half (list)
  (
last list (ceiling (/ (length list) 2))))
(
defun left-half (list)
  (
ldiff list (right-half list))) 

נערך לאחרונה ע"י hellfrost בתאריך 18-08-2010 בשעה 11:44.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #21  
ישן 18-08-2010, 17:06
  The_Equivocator The_Equivocator אינו מחובר  
 
חבר מתאריך: 11.02.04
הודעות: 16,543
בתגובה להודעה מספר 20 שנכתבה על ידי hellfrost שמתחילה ב "1. חוכמולוג שורש 5.... גם כן..."

1 הדרך שלך להתבטא דוגלת בטיפשות. מה זה "חוכמולוג"?
(1\2)^5 הוא אכן מספר לכל דבר. זה מאוד טיפשי מצדך לתת את ההערה הזו, לא מדובר כאן באיזה משהו מעורך, אלה בשיווין של ממש, ואכן אפשר להוכיח בנקל, כי הטווח של פונקציה זו, הוא המספרים הטבעים. במקרים שבהם מציאת נוסחה ישירה זה אפשרי, הדבר עדיף אלפי מונים על נוסחת נסיגה, והופך את הפתרון לO(1)
בעוד שנוסחה רקורסיבית של פיבונאצי שממומשת לא בצורה טובה(בלי ממוריזישן, זה אסון של ממש).
אבל גם הממוש הטוב ביותר לא יהיה קרוב ליעילות של נוסחה ישירה.

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

הן מאוד נעלות, הם פשוט העתיד של עולם התכנות..
כך נראה הקוד בC של מי שלא ממש הקדיש מחשבה לפני כן למה שהוא עושה, כך זה נראה בJAVA, בC, או בכל שפה אחרת(עם שינויים מינוריים).


קוד PHP:
 public static void merge(int[] arr,int iint j){
        
int[] tmp_arr = new int[j-i+1];
        
int sl=i,sr=(i+j)/2+1;
        
int k=0;
        
        while ((
sl<=(i+j)/2) && (sr<=j)){
            if (
arr[sl]<arr[sr]){
                
tmp_arr[k]=arr[sl];sl++;
            }
            else{
                
tmp_arr[k]=arr[sr];sr++;
            }
            
k++;
            
        }
        
        while (
sl<=(i+j)/2){
            
tmp_arr[k]=arr[sl];sl++;k++;
        }
        
            while (
sr<=j){
            
tmp_arr[k]=arr[sr];sr++;k++;
        }
        
        
k=0;
        for(;
i<=j;i++,k++){
            
arr[i]=tmp_arr[k];
        }
    }
    
    public static 
void sort(int[] arr,int i,int j){
    
        if (
i==j) return;//nothing to sort, only one item..
        
        
sort(arr,i,(i+j)/2);
        
sort(arr,(i+j)/2+1,j);
        
merge(arr,i,j);
    } 


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

נערך לאחרונה ע"י The_Equivocator בתאריך 18-08-2010 בשעה 17:31.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #25  
ישן 18-08-2010, 11:32
צלמית המשתמש של hellfrost
  hellfrost hellfrost אינו מחובר  
 
חבר מתאריך: 07.12.09
הודעות: 7,072
בתגובה להודעה מספר 19 שנכתבה על ידי The_Equivocator שמתחילה ב "1) טענה מאוד מעניינת..(לגבי..."

זה הקוד בC
קוד PHP:
 void mergeSort(int numbers[], int temp[], int array_size)
{
  
m_sort(numberstemp0array_size 1);
}
 
 
void m_sort(int numbers[], int temp[], int leftint right)
{
  
int mid;
 
  if (
right left)
  {
    
mid = (right left) / 2;
    
m_sort(numberstempleftmid);
    
m_sort(numberstempmid+1right);
 
    
merge(numberstempleftmid+1right);
  }
}
 
void merge(int numbers[], int temp[], int leftint midint right)
{
  
int ileft_endnum_elementstmp_pos;
 
  
left_end mid 1;
  
tmp_pos left;
  
num_elements right left 1;
 
  while ((
left <= left_end) && (mid <= right))
  {
    if (
numbers[left] <= numbers[mid])
    {
      
temp[tmp_pos] = numbers[left];
      
tmp_pos tmp_pos 1;
      
left left +1;
    }
    else
    {
      
temp[tmp_pos] = numbers[mid];
      
tmp_pos tmp_pos 1;
      
mid mid 1;
    }
  }
 
  while (
left <= left_end)
  {
    
temp[tmp_pos] = numbers[left];
    
left left 1;
    
tmp_pos tmp_pos 1;
  }
  while (
mid <= right)
  {
    
temp[tmp_pos] = numbers[mid];
    
mid mid 1;
    
tmp_pos tmp_pos 1;
  }
 
  for (
i=0<= num_elementsi++)
  {
    
numbers[right] = temp[right];
    
right right 1;
  }

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #26  
ישן 18-08-2010, 14:16
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 17 שנכתבה על ידי The_Equivocator שמתחילה ב "להתייחס לרקורסיה כאל..."

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

אחד זה תור של פעולות, והשני זו מחסנית של פעולות - המימוש שונה אבל הקשר לא מקרי.
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #29  
ישן 18-08-2010, 19:06
  The_Equivocator The_Equivocator אינו מחובר  
 
חבר מתאריך: 11.02.04
הודעות: 16,543
בתגובה להודעה מספר 28 שנכתבה על ידי Narxx שמתחילה ב "כדי להבין משהו שאתה עדיין לא..."

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

ציטוט:
סיבה נוספת לבלבול טמונה בעובדה, שהדוגמאות הראשונות שנבחרות להמחשת הרקורסיה הן כמעט תמיד דביליות. המפורסמת מכולן היא העצרת ("!n"), הלא היא מכפלת כל המספרים השלמים שבין 1 ל-n (כולל). לדוגמה, הערך של 4! הוא 4x3x2x1, כלומר 24. מימוש של עצרת באמצעות לולאה בסיסית הוא פשוט, אינטואיטיבי ובפועל גם יעיל ומהיר יותר מהמימוש הרקורסיבי. באמת, בדקנו. התלמיד האומלל, אם כך, תופס את הרקורסיה רק כשיטה לסבך דברים מובנים מאליהם, בערך כמו לבצע פעולת כפל באמצעות המון פעולות חיבור נפרדות.


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

נערך לאחרונה ע"י The_Equivocator בתאריך 18-08-2010 בשעה 19:22.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #30  
ישן 18-08-2010, 19:21
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 29 שנכתבה על ידי The_Equivocator שמתחילה ב "אני רוצה לצטט איזה קטע מהכתבה..."

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

אני חושב שאני מצליח להסביר לסטודנט, בסופו של דבר, בצורה די ברורה מה זו ריקורסיה כשאני יושב איתו 1 על 1 בכיתה.
הדבר הראשון שאני אומר לו בנושא הזה, כדי לשבור את הקרח זה בדיוק מה שכתבתי למעלה "תחשוב על ריקורסיה כעל לולאה שהולכת לבצע משהו מספר מסויים של פעמים...".
אח"כ נוכל לעמוד על ההבדלים ועל הגישה הטכנית איך לגשת לריקורסיה בהבנה וכתיבה, אבל להבין שזה "משהו שעושה משהו כמה וכמה פעמים כמו לולאה" שובר את הקרח ומאפשר להתקדם מבלי יותר מדי אנטגוניזם
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com


נערך לאחרונה ע"י Narxx בתאריך 18-08-2010 בשעה 19:24.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #32  
ישן 18-08-2010, 19:59
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 31 שנכתבה על ידי hellfrost שמתחילה ב "הם צודקים. מצביעים זה..."


אני לא הולך להתווכח על שפות תיכנות (אם כי יש לכם נטיה להוביל הרבה אשכולות לכיוון הזה ), אבל מצביעים זה דבר מאוד שימושי בשפת C.
בדומה להודעה שצוטטה מעלה מנענע, גם במצביעים - הדוגמאות הראשונות שמקבלים סטודנטים - דביליות:
קוד PHP:
 int x 5;
int *y;
= &x;
printf ("%d", *y); 

הדוגמא הקלאסית לשימוש במצביעים היא ברשימה מקושרת, אבל דווקא רשימה מקושרת נלמדת לאחר שהסטודנטים כביכול הבינו איך לעבוד עם מצביעים.
גם לשלוח מצביעים לפונקציה כדי "להחזיר" כביכול כמות גדולה יותר של נתונים מאשר 1, היא דוגמה מעניינת לשימוש במצביעים, אבל אני פחות אוהב אותה. ישנן שיטות טובות יותר להחזיר כמות של משתנים מפונקציה כמו להחזיר מבנה, אבל זו כבר חפירה בנושא אחר לגמרי
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #44  
ישן 18-08-2010, 23:04
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 43 שנכתבה על ידי The_Equivocator שמתחילה ב "ממש אבל ממש לא זו דעתך. ממש..."

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

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

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

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #59  
ישן 18-08-2010, 21:51
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 58 שנכתבה על ידי hellfrost שמתחילה ב "אם בא לך להגיב קצת עיניינית..."

שתי משמעויות לרקורסיה

בדיון למעלה נעשה בלבול בין שני דברים שונים.

משמעות אחת למושג רקורסיה, היא במובן של הגדרה רקורסיבית, כמו לדוגמה, הגדרה רקורסיבית
לסדרת פיבונא'צי⁽¹⁾ או הגדרה רקורסיבית של עצרת על המספרים הטבעיים⁽²⁾ - שתיים מהדוגמות
הנפוצות ביותר. דוגמה אחרת היא המשוואה הלוגיסטית⁽³⁾ (או 'המפה הלוגיסטית') - נוסחה שמייצגת
מודל פשוט מאוד לגידול של אוכלוסיה בבית-גידול נתון (r הוא "מקדם הגידול").
[tex]\begin{align}(1) \quad & F_1 = F_2 = 1 \\ \ & F_{n+1} = F_n+F_{n-1} \\ (2) \quad & N! = 0 \\ \ & N! = (N-1)! \cdot N \\ (3) \quad & X_{n+1} = r X_n (1-X_n) \end{align}[/tex]

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

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


רקורסיה ולולאות

אין הבדל בין רקורסיה ללולאות.

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

באופן דומה, בשפה מסוימת יכול להיות שרקורסיה ולולאה נראות שונה, אבל מנגנון הקריאה לפונקציות
הוא בסופו של דבר רק לדחיפת נתונים למחסנית וביצוע JMP, ובמקרה של פונקציות רקורסיביות -
דחיפת מידע למחסנית וביצוע JMP לתחילת ה"פונקציה" או ה"לולאה" (וגם לזה יש syntactic sugar
אפילו באסמבלי של x86 - ההוראה LOOP)

אין כאן אנלוגיה מוזרה, ואין כאן עצים ולינאריות. זה בדיוק אותו דבר.

לולאה לחלוטין איננה "פעולה אחת לינארית שחוזרת על עצמה". כמובן שזה תלוי בדרך שבה אנחנו
מגדירים "פעולה אחת לינארית" (אפשר להכניס כל פונקציה ב-C לתוך do { ... } while (0);‎, כדוגמה
קיצונית), אבל הלולאה שבתוך printf/scanf נראית קצת מוזר, והלולאה שבתוך NetPathCanonicalize
זה בכלל משהו הזוי. תציץ בה.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #61  
ישן 19-08-2010, 11:33
צלמית המשתמש של hellfrost
  hellfrost hellfrost אינו מחובר  
 
חבר מתאריך: 07.12.09
הודעות: 7,072
בתגובה להודעה מספר 59 שנכתבה על ידי פסטן שמתחילה ב "[u][b]שתי משמעויות..."

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

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

קוד:
(defun fibonacci (n) (if (< n 2) n (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))


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

מה זה משנה איך זה ממוש אם זה על LISP MACHINE או X86 או כל דבר אחר, או בכלל המימוש. רקורסיה זה דרך לבטא פונקציה שקוראת לעצמה, זה הכל.
שוב ההבדל הוא בסמנטיקה, לולאה זאת פעולה שקורת עד שתנאי כלשהו מתמלא, רקורסיה זה פונקציה שבישביל להחזיר ערך, יכולה לקרוא לעצמה, לפעמים היא מחליטה שלא, ופשוט מחזירה.

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

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

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

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

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



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

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

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

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