פונקציות ורקורסיה
פונקציות פונקציה: קטע קוד בעל שם ייחודי המבצע פעולה ניתן לקרוא לפונקציה במסגרת main (או במסגרת פונקציה אחרת) על ידי כתיבת שמה והפרמטרים יתרונות –שימוש חוזר –קל לתחזוק –מודולאריות – חלוקת המשימה לתתי משימות עצמאיות –אינקפסולציה – המשתמש לא חייב לדעת את פרטי המימוש
פונקציה שמחזירה ערך ופונקציה void ישנן פונקציות שמחשבות חישובים ומחזירות את התוצאה למי שקרא לה (לדוגמא pow, sin, strlen) יש פונקציות שרק מבצעות פעולות (כמו קלט ופלט) ולא מחשבות תוצאה שהתכנית תשתמש בה. לפונקציות כאלה קוראים void דוגמא: –לא void: a=min(x,y); –void: printNumber(a);
הגדרה ושימוש בפונקציה (<parameters list){ return ; } void main(){ … ( ); }
#include #define SIZE 100 void main() { int i, j, min, temp, nums[SIZE]; for (i=0; i<10; i++){ printf ("enter number\n"); scanf ("%d",&nums[i]); } for (i=0; i<SIZE; i++){ min = i; for (j=i+1; j<SIZE; j++) if (nums[j]<nums[min]) min = j; temp = nums[i]; nums[i] = nums[min]; nums[min] = temp; } for (i=0; i<SIZE; i++) printf ("%d\n",nums[i]); }
#include #define SIZE 100 void selectionSort(int ar[], int size){ int i, minInd; for (i=0; i<SIZE; i++){ minInd= findMinIndex(ar, size); swapElements(ar, i, minInd); } void main(){ int ar[SIZE]; readArrayFromUser(ar, SIZE); selectionSort(ar, SIZE); printArray(ar, SIZE) } יש להשלים את הפונקציות החסרות
הערות פונקציה יכולה לקבל יותר מפרמטר אחד פונקציה יכולה להכיל יותר משורת return אחת. שורת הreturn הראשונה שהפונקציה תיתקל בה תגרום לחזרה למי שקרא לפונקציה פונקציה void לא צריכה return בסוף פונקציה לא יכולה לשנות פרמטרים "פשוטים" (int, char), אבל יכולה לשנות מערכים (נלמד בהמשך את מקור ההבדל) פונקציה יכולה לקרוא לפונקציה אחרת
מערכים כפרמטרים אם רוצים מערך חד מימדי כפרמטר יש לרשום [ ] אם רוצים מערך דו מימדי כפרמטר יש לרשום [ ] [ ] דוגמאות: void selectionSort(int ar[], int size); void createBoard (int board [][8]);
אינדוקציה ממקרה בסיס וכלל התקדמות מגיעים להוכחת הטענה לכל המספרים. ההוכחה באינדוקציה הראשונה בהסטוריה (1575): סכום n המספרים האיזוגיים הראשונים שווה n 2 מקרה בסיס 1=1 2 נניח שהטענה נכונה עבור n כלשהו …+(2n-1)+(2n+1) = n 2 +(2n+1) = (n+1) 2
חישוב n! ברקורסיה int recFactorial(int n){ if(n<=1) return 1; return n*recFactorial(n-1); }
רקורסיה ללא מקרה בסיס #include void star(int n){ printf("*"); star (n-1); } void main(){ star(3); }
הדפסת כוכביות #include void star(int n){ if (n<=0) return; printf("*"); star (n-1); } void main(){ star(3); }
Merge Sort void mergeSort(int ar[],int lo,int hi){ if (lo<hi) { int m=(lo+hi)/2; mergeSort(ar,lo, m); mergeSort(ar, m+1, hi); merge(ar, lo, m, hi); }
Merge #define SIZE 100 void merge(int a[],int lo,int m, int hi){ int i, j, k, b[SIZE]; for (i=lo; i<=hi; i++) b[i]=a[i]; i=lo; j=m+1; k=lo; while (i<=m && j<=hi) if (b[i]<=b[j]) a[k++]=b[i++]; else a[k++]=b[j++]; while (i<=m) a[k++]=b[i++]; }
print1 #include void print1(int n){ if (n==0)return; printf ("%d\n",n); print1(n-1); } void main(){ print1(5); }
print2 #include void print2(int n){ if (n==0)return; print2(n-1); printf ("%d\n",n); } void main(){ print2(5); }
print3 #include void print3(int n){ if (n==0)return; printf ("%d\n",n); print3(n-1); printf ("%d\n",n); } void main(){ print3(5); }
print4 #include void print4(int n){ if (n==0)return; print4(n-1); printf ("%d\n",n); print4(n-1); } void main(){ print4(4); }
חישוב מספר פיבונאצ'י int recFib(int n){ if(n<=1) return n; return recFib(n-1)+ recFib(n-2); }
מגדלי הנוי בתחילת המשחק מונחות הדיסקיות על עמוד אחד מסודרות לפי גודל המטרה היא להעביר את כל הדיסקיות לעמוד האחרון בכל צעד מותר להעביר דיסקית אחת, ואסור לשים דיסקית גדולה על קטנה
פתרון עבור 4 דיסקיות
#include void moveDisk(int num, char from[], char to[]){ printf ("move disk %d from %s to %s\n", num,from,to); } void hanoi (int numDisks, char first[], char last[], char help[]){ if (numDisks == 1){ moveDisk(numDisks, first, last); } else{ hanoi(numDisks - 1, first, help, last); moveDisk(numDisks, first, last); hanoi(numDisks - 1, help, last, first); } void main(){ hanoi(3,"A","C","B"); }
output move disk 1 from A to C move disk 2 from A to B move disk 1 from C to B move disk 3 from A to C move disk 1 from B to A move disk 2 from B to C move disk 1 from A to C
הסברים אלטרנטיביים הגדרה מילונית: –רקורסיה עיין ערך רקורסיה מתרגל בשעור על רקורסיה –"אתם מתחילים..., ואז אתם פשוט צריכים להאמין שזה יעבוד, זה קצת קשה כי זה לא נראה ככה, אבל פשוט צריך שתהיה לכם אמונה בזה..."