מבוא למדעי המחשב 2019 תרגול 5 מחרוזות, חתימות ורקורסיה מחרוזות רצף של תווים רקורסיה קריאה של מתודה לעצמה באופן ישיר או עקיף
ראינו בהרצאה מחרוזות: תווים, חתימות: העמסה- String,הצהרה, overloading אתחול רקורסיה: הקטנת הבעיה- הגעה לתנאי עצירה פתרון הבעיה ע"י פתרון בעיה קטנה יותר
בתרגול היום מחרוזות: LCS צופן קיסר, מתודות וחתימות רקורסיה: חזקה, פלינדרום, עשרוני לבינארי, משולש פסקל
מחרוזות מאפשרות פעולות על רצפים של תווים
מחרוזות String s1; String s2 = abcd ; String s5 = new String( abcd ); String s3 = ; String s5 = new String(); String s4 = null;
מחרוזות - שיטות String s1 = hello ; String s2 = new String( hello ); System.out.println(s1 == s2); // false System.out.println(s1.equals(s2)); // true System.out.println(s1.length()); // 5 char c = s1.charat(1); // e char c2 = d ;
הצפנה באמצעות צופן קיסר 23 24 25 0 1 2 3 4 5 A-Z, a-z קלט: מחרוזת המורכבת מהתווים מספר טבעי המייצג את מפתח ההצפנה 0 1 2 3 4 5 6 7 8 פלט: מחרוזת מוצפנות באמצעות צופן קיסר "BEN GURION UNIVERSITY" key = 3 "EHQ JXULRQ XQLYHUVLWB"
צופן קיסר
צופן קיסר String s = ALOHA ; int key = 3; 87 89 90 65 66 67 68 69 70 int c = s.charat(0); c = c A ; c = c + key; c = c + A ; System.out.println((char)c); 65 66 67 68 69 70 71 72 73 // 65 // 0 // 3 // 68 // D A 65 B 66 C 67 D 68 E 69 F 70 G 71 H 72 I 73 J 74 K 75 L 76 M 77 ערכי ASCII N 78 O 79 P 80 Q 81 R 82 S 83 T 84 U 85 V 86 W 87 X 88 Y 89 Z 90
צופן קיסר - מימוש public static String encrypt(string str, int key) { 1 String encrypted = ""; 2 final int ALPHABET_SIZE = 26; // Z A + 1; 3 for (int i = 0; i < str.length(); i=i+1) { 4 int c = str.charat(i); 5 if ('A'<=c & c<='z') { 6 c = c - 'A'; 7 c = ((c + key) % ALPHABET_SIZE )+'A'; 8 9 else if ('a'<=c & c<='z') { 10 c = c - 'a'; 11 c = ((c + key) % ALPHABET_SIZE )+'a'; 12 13 encrypted = encrypted + (char)c; 14 15 return encrypted;
בעיית תת-מחרוזת משותפת מקסימלית Longest Common Substring
Longest common substring S 2 ו- S 1 קלט: שתי מחרוזות פלט : אורך תת-מחרוזת ארוכה ביותר אשר משותפת ל S 1 ו- S. 2 System.out.println(lcs("1234", "3456")); //2 System.out.println(lcs("abaaacdcfg", "babaacdfgacdcfaadcgf")); //5
Longest common substring בעיה פשוטה יותר 0 1 2 3 4 5 6 String s1 = climbing ; String s2 = lime"; 0 1 2 3 S 2 ו- S 2 ל S 1 S 2 ו- i 2 ו- S 1 i 1 קלט: שתי מחרוזות שני אינדקסים אורך תת-מחרוזת ארוכה ביותר אשר משותפת i 2 S 1 i 1 פלט : ומתחילה באינדקס במחרוזת ובאינדקס במחרוזת i 1 = 1 i 2 = 0 public static int lcsat(string s1, String s2, int i1, int i2){ int substringlength = 0; while( (i1 < s1.length() & i2 < s2.length()) && s1.charat(i1) == s2.charat(i2) ){ i1 = i1 + 1; i2 = i2 + 1; substringlength = substringlength + 1; return substringlength;
Longest Common Substring public static int lcs(string s1, String s2){ // assume s1 and s2 are not null int maxlength = 0; for (int i1 = 0; i1 < s1.length(); i1 = i1+1) for (int i2 = 0; i2 < s2.length(); i2 = i2+1) if ((i1==0 i2==0) s1.charat(i1-1)!= s2.charat(i2-1)) maxlength = Math.max(maxLength, lcsat(s1, s2, i1, i2)); return maxlength; אופטימיזציה public static int lcsat(string s1, String s2, int i1, int i2){ int substringlength = 0; while( (i1 < s1.length() & i2 < s2.length()) && s1.charat(i1) == s2.charat(i2) ){ i1 = i1 + 1; i2 = i2 + 1; substringlength = substringlength + 1; return substringlength;
חתימות והעמסה חתימה של פונקציה: public static <return type> <method name> (<type-1> x1 <typ-2> x2...) {... מורכבת אך ורק משם הפונקציה ומרשימת טיפוסי הפרמטרים. הטיפוסים ברשימה, הסדר שלהם ואורך הרשימה משנים את החתימה. לכל זוג פונקציות חתימה שונה.
חתימות והעמסה public class Overloading { public static String plus(int n, double d) { return "int double"; public static String plus(double d, int n) { return "double int"; public static String plus(int d, int n) { return "int int"; public static void main(string[] args) { int x = 0; double y = 0.0; System.out.println(plus(x, y)); System.out.println(plus(y, x)); System.out.println(plus(x)); System.out.println(plus(x, x)); System.out.println(plus(y, y));
חתימות והעמסה מה יקרה כאן? public class Overloading { public static String plus(int n, double d) { return "int double"; public static String plus(double d, int n) { return "double int"; public static void main(string[] args) { int x = 0; System.out.println(plus(x, x));
רקורסיה קריאה של פונקציה לעצמה באופן ישיר או עקיף
רקורסיה שלושת הכללים לבניית שיטה רקורסיבית: תנאי עצירה שניתן לענות עליו ללא קריאה רקורסיבית. )תנאי בסיס( קריאה רקורסיבית עם קלט הקרוב יותר לתנאי העצירה )הקטנת הבעיה(. שימוש בתוצאת הקריאה הרקורסיבית לחישוב התוצאה המוחזרת )השלמת הפתרון(..1.2.3
חישוב חזקה b a נרצה לכתוב פונקציה ומחשבת את a b רקורסיבית המקבלת שני מספרים טבעיים ו public static int exp(int a, int b) { int result; if (b == 0) { result = 1; else { result = a * exp(a, b - 1); return result;
רקורסיה איזה מן המשפטים הבאים יוצא דופן? רק פושטק עלוב בולע קטשופ קר 1. רבע הלילה עבר 2. Was it a car or a cat I saw.3 ארון קיר היה ריק נורא 4. מי לימד מילים 5. רקורסיה כי מי שמאמין לא מפחד 6. מי אמר שיש רמאים 7.
הפסקה
פלינדרום נרצה לכתוב פונקציה רקורסיבית אם המחרוזת היא פלינדרום ו הפרמטר אינו.null המקבלת,False - מחרוזת, ומחזירה True אחרת. ניתן להניח כי public static boolean ispalindrome(string s) { boolean ans = false; if (s.length() == 0 s.length() == 1) { ans = true; else if (s.charat(0) == s.charat(s.length() - 1)) { ans = ispalindrome(s.substring(1, s.length() - 1)); return ans;
הדפסת יצוג בינארי של מספר שלם חיובי,n כתבו פונקציה רקורסיבית (n printbinary(int הבינארי שלו מבלי להשתמש במחרוזות. אשר בהינתן שלם חיובי, הייצוג את מדפיסה public static void printbinary(int n){ if(n >= 2) // print the first digits (most significant bits) printbinary(n/2); // print lsb (last digit) System.out.print(n%2);
משולש פסקל n 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 0 1 2 3 4 5 k
משולש פסקל n pascal(int n, int k). כתבו פונקציה רקורסיבית ובעמודה k במשולש פסקל המחשבת המספר את המופיע בשורה n k k=0 או k=n נחזיר.1 תיאור האלגוריתם: תנאי העצירה: עבור קריאה רקורסיבית )הקטנת הבעיה(: קריאה אחת עם )1-n( ו - k קריאה שנייה עם )1-n( ו )1-k( שילוב התוצאות לקבלת תשובה: חיבור הערכים שהתקבלו משתי הקריאות הרקורסיביות..1.2.3 n 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 0 1 2 3 4 5 k
משולש פסקל // Pascal number in row n and column k public static int pascal(int n, int k){ int ans; if (k<0 n<0 n<k) { ans = -1; else if (k == 0 n == k) { ans = 1; else { ans = pascal(n-1,k) + pascal(n-1,k-1); return ans; n 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 5 1 5 10 10 5 1 0 1 2 3 4 5 k
סיכום ומשימות תרגלנו: מחרוזות, חתימות ורקורסיה