Download presentation
Presentation is loading. Please wait.
Published byBertha Byrd Modified over 9 years ago
1
מבוא למדעי המחשב הרצאה 9: תכנות רקורסיבי 2 1
2
חישוב עצרת: רקורסיית זנב public static int fact (int n){ return factacc(n,1); } public static int factacc (int n, int acc){ int ans; if (n==0) ans = acc; else ans = factacc(n-1,n*acc); return ans; } 2
3
public static String reverse(String s){ String answer; if (s.length()==0) answer = s; else answer = reverse(s.substring(1)) + s.charAt(0); return answer; } היפוך מחרוזת 3
4
public static String reverse(String s) { return reverse(s,""); } public static String reverse(String s, String acc){ String answer; if (s.length()==0) answer = acc; else answer = reverse(s.substring(1), s.charAt(0)+acc); return answer; } היפוך מחרוזת – רקורסיית זנב 4
5
מציאת אינדקס האיבר המינימלי public static int recFindMin(int [] array, int i){ // finds the index of the minimal value in "array" // from "i" (inclusive) till array.length. // assumes that: "i" is in the range of the index. int ans = i; if (i<array.length-1) { int j = recFindMin(array,i+1); if (array[j]<array[i]) ans = j; else ans = i; } return ans; { 5
6
לעתים נרצה להוסיף פונק' שכל תפקידה לקרוא לפונקציה הרקורסיבית: public static int findMin (int [] arr) { return recFindMin(arr,0); } 6
7
חיפוש בינארי public static int binarySearch(int e, int[] a){ int from = 0, till = a.length-1; int ans = -1; while (from <= till & ans==-1){ int mid = (from + till)/2; if (e < a[mid]) till = mid-1; else if (e > a[mid]) from = mid+1; else ans = mid; } return ans; } 7
8
חיפוש בינארי רקורסיבי public static int recSearch(int e, int[] arr) { return recSearch(e, arr, 0, arr.length-1); } 8
9
חיפוש בינארי רקורסיבי public static int recSearch(int e, int[] a, int from, int till){ int ans = -1; if (from <= till) { int mid = (from + till)/2; if (e < a[mid]) ans = recSearch(e,a,from,mid-1); else if (e > a[mid]) ans = recSearch(e,a,mid+1,till); else ans = mid; } return ans; } 9
10
מגדלי הנוי הבעיה: נתונות n טבעות המסודרות לפי גודלן על מוט a. נרצה להעביר אותן (בצורה חוקית) למוט c העברה חוקית: אין טבעת המונחת מעל טבעת קטנה ממנה. 10
11
פתרון: נרצה להעביר את n-1)) הטבעות מ a ל b. נעביר את הטבעת הגדולה מ a ל c. נעביר את הערימה (n-1) מ b ל c. 11
12
מגדלי הנוי - קוד public static void hanoi(int n, char source, char destination, char extra) { if (n > 0) { hanoi(n-1,source,extra,destination); System.out.println("Move disk from "+source+ " to "+destination); hanoi(n-1,extra,destination,source); } 12
13
מגדלי הנוי ( דוגמת הרצה ) Move disk from a to c Move disk from a to b Move disk from c to b Move disk from a to c Move disk from b to a Move disk from b to c Move disk from a to c 13
14
מיון בחירה public static void selectionSort (int[] arr) { int to = arr.length; for(int from=0;from<to-1;from=from+1) { int minInd = recFindMin(arr,from); swap(arr, from, minInd); } 14
15
מיון בחירה - רקורסיבי public static void recSelSort(int[] array){ selSort(array,0); } public static void selSort(int[] array, int i){ // sort array from i (till i is sorted and min) if (i<array.length){ swap(array,i,minIndex(array,i)); selSort(array,i+1); } 15
16
לבית: ממשו מיון הכנסה רקורסיבי ודאו הבנת "ריצה על הנייר" של מגדלי הנוי, ונסו לכתוב תכנית לא רקורסיבית עבור בעיה זו. 16
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.