הוראת אינדוקציה ורקורסיה במדעי המחשב

Post on 31-Dec-2015

49 Views

Category:

Documents

15 Downloads

Preview:

Click to see full reader

DESCRIPTION

הוראת אינדוקציה ורקורסיה במדעי המחשב. הסמינר המיוחד למורי תיכון מובילים במדעי המחשב טכניון , חיפה, יולי 2012. ראובן בר-יהודה. איך מפולת של אבני דומינו קשור לתכנון לולאות?. תשובה: אינדוקציה. תנאים מספיקים לנפילת שורת אבני הדומינו: בסיס: הראשון נופל. צעד: אם מישהו נופל, אז זה שאחריו נופל. - PowerPoint PPT Presentation

TRANSCRIPT

הוראת אינדוקציה ורקורסיה במדעי המחשב

הסמינר המיוחד למורי תיכון מובילים במדעי המחשב

2012טכניון, חיפה, יולי

ראובן בר-יהודה

איך מפולת של אבני דומינו קשור לתכנון לולאות?

2

תשובה: אינדוקציה

3

תנאים מספיקים לנפילת שורת אבני הדומינו:

בסיס: הראשון נופל.

צעד: אם מישהו נופל, אז זה שאחריו נופל

...OK(1) OK(n-1) OK(n)

OK(1)

OK(n-1) OK(n)

תכונות אחרות...

4

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

בסיס: הראשון חולה.

צעד: אם מישהו חולה, אז זה שאחריו חולה

Sick(1)

...Sick(1) Sick(n-1)Sick(n)

Sick(n-1)Sick(n)

צעדים אחרים

5

מה לגבי צעדי אינדוקציה אחרים, למשל:

צעד: המחלה מדבקת בקפיצות של שתיים

בסיס: הראשון חולה.

...

Sick(1), Sick(2)

Sick(n-2)Sick(n)

Sick(1) Sick(n-2) Sick(n)Sick(2)

אינדוקציה שלמה

6

תנאים מספיקים לנפילת שורת אבני הדומינו:

אם כל אלו שלפני נופלים

אז גם אני נופל

...( ) ( )i nOK i OK n

(1)OK ( )OK i

...( 1)OK n ( )OK n

אינדוקציה שלמה: דוגמא

7

קוביות שוקולד.n חיתוכים כדי להגיע ל-n-1טענה: דרושים בדיוק

חיתוכיםn = 1 0הוכחה: בסיס:

n = i + jצעד: נחתוך שרירותית לחלקים לא ריקים:

j < n חיתוכים j - 1

i < n חיתוכים i - 1

1חיתוכים

i-1 + j-1 + 1 = n - 1

אינדוקציה לא קווית

8

DOMINOS

דוגמאות על הלוח...

תכנון לולאות עם מחשבה באינדוקציה

sum מערך חד מימדי (ללא שימוש בסכום כתוב פונקציה שמחשבת (

9

1. function y = my_sum(x)

2. y = 0; % OK(0)

3. for n = 1:length(x) % OK(n-1)

4. y = y + x(n); % OK(n)

5. end

.טענת האינדוקציה

y = x(1)+x(2)+…+x(n) איטרציות:n לאחר

.n באינדוקציה על הוכחה

.0 איטרציות מכיל את ערך האתחול שהוא 0 לאחר n =0 בסיס:

y = x(1)+x(2)+…+x(n-1) איטרציות n-1 נניח שלאחר צעד:

וסיימנו.x(n) את y למוסיפים nבאיטרציה ה

תכנון לולאות עם מחשבה באינדוקציה

מערך חד מימדי (ללא שימוש במכפלתכתוב פונקציה שמחשבת prod(

10

1. function y = my_prod(x)

2. y = 1; % OK(0)

3. for n = 1:length(x) % OK(n-1)

4. y = y * x(n); % OK(n)

5. end

.טענת האינדוקציה

y = x(1)*x(2)*…*x(n) איטרציות:n לאחר

.n באינדוקציה על הוכחה

.1 איטרציות מכיל את ערך האתחול שהוא 0 לאחר n =0 בסיס:

y = x(1)*x(2)*…*x(n-1) איטרציות n-1 נניח שלאחר צעד:

וסיימנו.x(n) ב y אתמכפילים nבאיטרציה ה

תכנון לולאות עם מחשבה באינדוקציה

מערך חד מימדי (ללא שימוש ב שלORכתוב פונקציה שמחשבת any(

11

1. function y = my_any(x)

2. y = false; % OK(0)

3. for n = 1:length(x) % OK(n-1)

4. y = y || x(n); % OK(n)

5. end

.טענת האינדוקציה

y = x(1)x(2)…x(n) איטרציות:n לאחר

.n באינדוקציה על הוכחה

.false איטרציות מכיל את ערך האתחול שהוא 0 לאחר n =0 בסיס:

y = x(1)x(2)…x(n-1) איטרציות n-1 נניח שלאחר צעד:

וסיימנו.x(n) את yל"מוסיפים" nבאיטרציה ה

if y

return

end

תכנון לולאות עם מחשבה באינדוקציה

all מערך חד מימדי (ללא שימוש ב שלANDכתוב פונקציה שמחשבת (

12

1. function y = my_all(x)

2. y = true; % OK(0)

3. for n = 1:length(x) % OK(n-1)

4. y = y && x(n); % OK(n)

5. end

.טענת האינדוקציה

y = x(1)x(2)…x(n) איטרציות:n לאחר

.n באינדוקציה על הוכחה

.true איטרציות מכיל את ערך האתחול שהוא 0 לאחר n =0 בסיס:

y = x(1)x(2)…x(n-1) איטרציות n-1 נניח שלאחר צעד:

וסיימנו.x(n) ב yאת"מכפילים" nבאיטרציה ה

if ~y

return

end

תכנון לולאות עם מחשבה באינדוקציה

מערך חד מימדי (ללא שימוש מקסימום שלכתוב פונקציה שמחשבת )maxב

13

1. function y = my_max(x)

2. y = - ; % OK(0)

3. for n = 1:length(x) % OK(n-1)

4. if x(n) > y y = x(n); end % OK(n)

5. end

.טענת האינדוקציה

y = MAX{x(1),x(2),…,x(n)} איטרציות:n לאחר

.n באינדוקציה על הוכחה

.- איטרציות מכיל את ערך האתחול שהוא 0 לאחר n =0 בסיס: y = MAX{x(1),x(2),…,x(n-1)} איטרציות n-1 נניח שלאחר צעד:

וסיימנו.x(n) ב yאת"מחליפים, אם גדול יותר" nבאיטרציה ה

תכנון לולאות עם מחשבה באינדוקציה

מערך חד מימדי (ללא שימוש במינימום שלכתוב פונקציה שמחשבת min(

14

1. function y = my_min(x)

2. y = + ; % OK(0)

3. for n = 1:length(x) % OK(n-1)

4. if x(n) < y y = x(n); end % OK(n)

5. end

.טענת האינדוקציה

y = MIN{x(1),x(2),…,x(n)} איטרציות:n לאחר

.nהוכחה באינדוקציה על

.- איטרציות מכיל את ערך האתחול שהוא 0 לאחר n =0 בסיס: y = MIN{x(1),x(2),…,x(n-1)} איטרציות n-1 נניח שלאחר צעד:

וסיימנו.x(n) ב yאת"מחליפים, אם קטן יותר" nבאיטרציה ה

Sorting

512354277 101

5 12 35 42 77 101

1 2 3 4 5 6

1 2 3 4 5 6

sort-by_max.m

1. function a = sort_by_max( a )

2. % sort members of array in non decreasing order

3. for top = length(a):-1:1 % at this point all members above index “top” are in their proper location

4. i = index_of_max(a,top);

5. temp = a(i); a(i) = a(top); a(top) = temp; %swap a(i) with a(top)

6. end

7. end

8.

9. function i_max = index_of_max( a, n )

10. % find the index of the maximum member among a(1:n)

11. i_max = 1;

12. for i = 2:n % invariant: at this point a(i_max) = MAXIMUM{a(1), a(2)…a(i-1)}

13. if a(i) > a(i_max)

14. i_max = i;

15. end

16. end

17. end

16

חיפוש במערכים ממוינים

17

חיפוש בינארי

18

1.function m = bin_search (x, a) 2. % a is a non decreasing sorted array3. % find x in a and return in m its index.4. % if x is not there, m = -15. b = 1; t = length(a);6. while b <= t7. m = floor((b+t)/2);8. if a(m) == x9. return10. elseif a(m) > x11. t = m-1;12. else13. b = m+1;14. end15. end16. m = -1;

חיפוש בינארי: נכונות

19

1.function m = bin_search (x, a) 2. b = 1; t = length(a);3. while b <= t4. m = floor((b+t)/2);5. if a(m) == x6. return7. elseif a(m) > x8. t = m-1;9. else10. b = m+1;11. end12. end13. m = -1;

בכל איטרציהשמורות x לא נמצא ב a(1 : b-1) x לא נמצא ב a(t+1: end)

: באינדוקציה על מספר האיטרציות:הוכחה איטרציות- נכונות באופן ריק.0: בסיסצעד:a(m) > xאם

a(m:end)אז כל האיברים ב ולכן הוא לא שם,xגדולים ממש מ-

a(m) < xאם a(1:m)אז כל האיברים ב

ולכן הוא לא שם.xקטנים ממש מ-

)5 לא נמצא (שורה x: אם בסיוםb>t בה מתקיים 13אז נגיע לשורה

ומכאן נובע שהאיחוד שלa(t+1: end) ו a(1 : b-1)

a לא נמצא ב-x ולכן, לפי השמורות,aמכיל את כל איברי

b t

O(log(n))חיפוש בינארי: סיבוכיות זמן

20

1. function m = bin_search (x, a) 2. b = 1; t = length(a);3. while b <= t4. m = floor((b+t)/2);5. if a(m) == x6. return7. elseif a(m) > x8. t = m-1;9. else10. b = m+1;11. end12. end13. m = -1;

.2 נחצה ב-b:tבכל איטרציה האינטרוואל nאם אורכו בהתחלה היה

n/2אז לאחר איטרציה אחת הוא יהיה בערך n/4לאחר עוד איטרציה הוא יהיה בערך n/8לאחר עוד איטרציה הוא יהיה בערך

n/2k איטרציות הוא יקטן ל kולכן לאחר

הביטוי הנ"ל יהיה קטן מדי?kש: עבור איזה n/2k > 1ת: נפתור את אי השוויון:

2k > nאו: k = log2(n)וזה יקרה כאשר

מכאן מספר האיטרציות O(log (n)(ולכן סיבוכיות הזמן) הוא (

מיזוג מערכים ממוינים:

21

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

output array

20

13

7

2

12

11

9

1

1output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

9output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

9

20

13

12

11

output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

9

20

13

12

11

11output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

9

20

13

12

11

11

20

13

12

output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

9

20

13

12

11

11

20

13

12

12output array

Merging two sorted arrays (Silvio Micali MIT)

20

13

7

2

12

11

9

1

1

20

13

7

2

12

11

9

2

20

13

7

12

11

9

7

20

13

12

11

9

9

20

13

12

11

11

20

13

12

12

Time = Q(n) to merge a total of n elements (linear time).

output array

Merging two sorted arrays (Silvio Micali MIT)

מיזוג1. function c = merge(a,b)2. % given non decreasing sorted arrays a,b3. % return in c the sorted merge of a and b4. n_a = length(a); n_b = length(b); 5. n_c = n_a + n_b; c = zeros(1,n_c);6. i_a = 1; i_b = 1;7. for i_c = 1 : n_c;8. if i_b > n_b 9. c(i_c) = a(i_a);10. i_a = i_a +1;11. elseif i_a > n_a12. c(i_c) = b(i_b);13. i_b = i_b +1;14. elseif a(i_a) < b(i_b)15. c(i_c) = a(i_a);16. i_a = i_a +1;17. else % a(i_a) >= b(i_b)18. c(i_c) = b(i_b);19. i_b = i_b +1;20. end21. end

35

נכונות

שמורות:

c(1:i_c-1)ממויין

c(1:i_c-1) מכיל את איברי a(1:i_a-1) b(1:i_b-1)

קטנים או שווים לכל האיברים ב c(1:i_c-1)כל האיברים ב a(i_a,end)

קטנים או שווים לכל האיברים ב c(1:i_c-1)כל האיברים ב b(i_b,end)

באינדוקציה על מספר האיטרציות

בסיס: נכון באופן ריק

צעד: ..36

a(1:i_a)-1

i_a n_a1 2 3 …

סיבוכיות לינארית

1. function c = merge(a,b)2. % time complexity3. % is O(length(a)+length(b))4. n_a = length(a); n_b = length(b); 5. n_c = n_a + n_b; c = zeros(1,n_c);6. i_a = 1; i_b = 1;7. for i_c = 1 : n_c;8. if i_b > n_b 9. c(i_c) = a(i_a);10. i_a = i_a +1;11. elseif i_a > n_a12. c(i_c) = b(i_b);13. i_b = i_b +1;14. elseif a(i_a) < b(i_b)15. c(i_c) = a(i_a);16. i_a = i_a +1;17. else % a(i_a) >= b(i_b)18. c(i_c) = b(i_b);19. i_b = i_b +1;20. end21. end

37

קבוע?

n_a + n_b פעמים

!קבוע

רקורסיה

רקורסיה

. מסתמכת על עצמה אם היא הגדרה רקורסיביתהגדרה היא •דוגמאות:

הוא מי שנולד לאם יהודי: "אדם יהודית ההלכהלפי ה•

יה". משמעות ההגדרה הרקורסיבית הינה שעל מנת לדעת יהודימו, דבורה, היא cאם אדם פלוני, משה, הוא יהודי יש לדעת אם א

מה, רות, היא cיהודייה. אך בהתאם להגדרה, דבורה יהודייה אם איהודייה. כדי לבדוק אם רות היא יהודייה צריך להשתמש שוב

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

רקורסיה לערך "רקורסיה": "ראו ערך הומוריסטית־מילוניתהגדרה •."

39

)WIKIהגדרה רקורסיבית (מתוך

אינדוקציה

40

בסיס: הראשון נופל.

צעד: אם מישהו נופל, אז זה שאחריו נופל

...OK(1) OK(n-1) OK(n)

OK(1)

OK(n-1) OK(n)

רקורסיה

41

ליפולn-1 מבקש מדומינו nדומינו

ליפולn-2מבקש מדומינו n-1דומינו

...

ליפול1מבקש מדומינו 2דומינו

נופל ורק אז מפולת הדומינו מתחילה1

...האם את

?יהודיה

האם את

?יהודיה

האם את

?יהודיה

האם את

?יהודיה

האם את

?יהודיה

הש

מ

הור

בד

תרו

השר

שימו לב שיש עץ של דומינו שהרקורסיה הנ"ל חשפה בו רק את השרשרת

הרלוונטית.

42שרה

משהדבורה

רות

43

דוגמאות להגדרות ע"י נוסחת נסיגה

נוסחה "סגורה"an=f(n,<parameters>)

נוסחת נסיגהan=f(an-1,.., an-k)

הסדרה

an = a1 + (n-1)∙d a1

an = an-1 + d

סדרה חשבונית:3, 13, 23, 33, …

an=a1∙qn-1 a1

an = q∙an-1

סדרה הנדסית7, 14, 28, 56, …

אין נוסחה סגורה "יפה" a1 = 1

an = n∙an-1

עצרת1, 2, 6, 24, 120, …

an = (φn - (1 - φ)n) / 5φ = (1+5) / 2 ~= 1.6180כאשר

נקרא "יחס הזהב")φ(המספר

a1 = a2 = 1

an = an-1 + an-2

פיבונאצ'י1, 1, 2, 3, 5, 8, 13, …

44

רקורסיה בחישוב עצרת

:myfactr(5)נעקב אחרי הביצוע של •

n = 5

f= 5 *

myfactr(5)

n = 4

f= 4 *

myfactr(4)

n = 3

f= 3 *

myfactr(3)

n = 2

f= 2 *

myfactr(2)

n = 1

f= 1

myfactr(1)

function f=myfactr(n) if n==1, f=1; else f=n*myfactr(n-1); end

בסיס הרקורסיה

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

45

רקורסיה בחישוב עצרת

המשך ביצוע: "קפול" הרקורסיה.•

n = 5

f= 5 *

myfactr(5)

n = 4

f= 4 *

myfactr(4)

n = 3

f= 3 *

myfactr(3)

n = 2

f= 2 *

myfactr(2)

n = 1

f= 1

myfactr(1)

120

24

6

2

1

46

myfactr הפונקציה הוכחת נכונות של

עם קלט myfactrהפונקציה , nטענה: לכל מספר טבעי •n עוצרת כאשר הערך של המשתנהf הוא n!.

:nהוכחת נכונות ע"י אינדוקציה על הקלט •.1 תחזיר myfactr(1), בדיקה ישירה מראה כי n<2 עבור בסיס:–!. אזי:myfactr(n-1) = (n-1)צעד: נניח כי –

myfactr(n) = n∙myfactr(n-1) = n∙(n-1)! = n!

function f=myfactr(n) if n<2, f=1; else f=n*myfactr(n-1); end

הנחת האינדוקציה

Recursive Mona Liza

(מיקום, גודל)צייר_מונה

צייר_מלבן(מיקום, גודל)1.

אם הגודל קטן מדי, סיים.2.

צייר_פרצוף(מיקום, גודל)3.

(מיקום, גודל מוקטן)צייר_מונה4.

47

Recursive Mona Liza

48-25 -20 -15 -10 -5 0 5 10 15 20 250

5

10

15

20

25

30

35

40

1. function [] = mona(x,y,r) 2. hold on 3. plot(x+r*[0 2 2 -2 -2 0], y+r*[0 0 4 4 0 0])4. axis equal5. if r < 0.1 6. return;7. end8. face(x, y+3*r, r)

9. mona(x, y, 0.5*r)10.end

Face for mona

1. function [] = face(x,y,r)

2. cycle(x,y,r);

3. r0 = 0.3975*r;

4. cycle(x-r/2, y+r/3, r0);

5. segment(x,y-r/2,x,y+r/2);

6. cycle(x+r/2, y+r/3, r0);

7. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);

8. end

49

1. function []=segment(x1,y1,x2,y2)2. hold on3. plot([x1,x2],[y1,y2]);4. end

1. function []=arc_cycle(x0,y0,r,A,B)2. t = linspace(A,B,100);3. x = cos(t); y = sin(t);4. plot(r*x+x0, r*y+y0);5. end

1. function []=cycle(x0,y0,r)2. arc_cycle(x0,y0,r,0,2*pi);3. end

-10 -8 -6 -4 -2 0 2 4 6 8 10-10

-8

-6

-4

-2

0

2

4

6

8

10

מימוש אינדוקטיבי כנגד רקורסיבי

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

50

1. function y = my_sum(x, n)

2. y = 0;

3. for k = 1:n

4. y = y + x(k);

5. end

מימוש רקורסיבי

1. function y = my_sum(x, n)

2. if n==0 y = 0; return; end

3. y = my_sum(x, n-1) + x(n);

51

1. function y = my_prod(x, n)

2. y = 1;

3. for k = 1:n

4. y = y * x(k);

5. end

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

מימוש רקורסיבי

1. function y = my_prod(x, n)

2. if n==0 y = 1; return; end

3. y = my_prod(x, n-1) * x(n);

מימוש אינדוקטיבי כנגד רקורסיבי

52

1. function y = my_any(x, n)

2. y = false;

3. for k = 1:n

4. y = y || x(k);

5. endif y

retuen

end

מימוש רקורסיבי

1. function y = my_any(x, n)

2. if n==0 y = false; return; end

3. y = my_any(x, n-1) || x(n); if x(n) y

=true; re

turn; end

y = my_any(x, n

-1) ;

מימוש אינדוקטיבי כנגד רקורסיבי

האיברים הראשונים במערך חד n של ORכתוב פונקציה שמחשבת מימדי

53

1. function y = my_all(x, n)

2. y = true;

3. for k = 1:n

4. y = y && x(n);

5. endif ~y

retuen

end

מימוש רקורסיבי

1. function y = my_all(x, n)

2. if n==0 y = true; return; end

3. y = my_all(x, n-1) || x(n); if ~x(n) y

=false; return; e

nd

y = my_all(x

, n-1) ;

מימוש אינדוקטיבי כנגד רקורסיבי

האיברים הראשונים במערך חד n של ANDכתוב פונקציה שמחשבת מימדי

54

55

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

56

Line =2x=0y=0r=100

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

57

Line =3x=0y=0r=100

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

58

Line =4x=0y=0r=100

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

59

Line =5x=0y=0r=100

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

60

Line =8x=0y=0r=100r0=40 40

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

61

Line =9x=0y=0r=100r0=40

-50 +33 40

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

62

Line =9x=0y=0r=100r0=40

-50 +33 40 Line =2x=-50y=33r=40

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

63

Line =9x=0y=0r=100r0=40

Line =3x=-50y=33r=40

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

64

Line =9x=0y=0r=100r0=40

Line =4x=-50y=33r=40

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

65

Line =9x=0y=0r=100r0=40

Line =5x=-50y=33r=40

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

66

Line =9x=0y=0r=100r0=40

Line =8x=-50y=33r=40

16

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

67

Line =9x=0y=0r=100r0=40

Line =9x=-50y=33r=40r0=16

-70 +47 16

16

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

68

Line =9x=0y=0r=100r0=40

Line =8x=-50y=33r=40r0=16

-70 +47 16 Line =2x=-70y=47

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

69

Line =9x=0y=0r=100r0=40

Line =8x=-50y=33r=40r0=16

Line =3x=-70y=47

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

70

Line =9x=0y=0r=100r0=40

Line =8x=-50y=33r=40r0=16

Line =4x=-70y=47

1.function [] = face(x,y,r) 2. hold on 3. axis equal4. cycle(x,y,r);5. if r < 10 6. return;7. end8. r0 = 0.4*r;

9. face(x-r/2, y+r/3, r0);10. segment(x,y-r/2,x,y+r/2);

11. face(x+r/2, y+r/3, r0);12. arc_cycle(x,y,.8*r,1.25*pi,1.75*pi);13.end

-100 -50 0 50 100

-80

-60

-40

-20

0

20

40

60

80

Recursive face

71

Line =9x=0y=0r=100r0=40

Line =8x=-50y=33r=40r0=16

Line =8x=-70y=47

3D recursive face

72

-1

0

1

-1-0.5

00.5

1

-1

-0.5

0

0.5

1

1.5

yx

z

3D recursive face

73

1. function [] = face3d(x,y,z,r) 2. hold on 3. axis equal; grid on4. ellipsoid(x,y,z,r,r,r);5. if r < 0.1 return; end6. r0 = 0.3*r;

7. face3d(x-r/2, y+r/3,z+0.9*r, r0); %left recursion8. face3d(x+r/2, y+r/3,z+0.9*r, r0); %right recursion9. ellipsoid(x,y,z+r,r/10,r/4,r/2); % nose10. ellipsoid(x,y-r/2,z+0.8*r,r/2,r/10,r/10); % mouth11. xlabel('x'); ylabel('y'); zlabel('z');12.end

-1

0

1

-1-0.5

00.5

1

-1

-0.5

0

0.5

1

1.5

yx

z

74

פתרונות רקורסיביים בזבזניים

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

נדגים זאת על ידי פונקציה רקורסיבית פשוטה לחישוב •-י בסדרת פיבונאצ'י.nהאבר ה

-י היא על ידי שימוש בנוסחה nנעיר שהתכנית הכי יעילה לחישוב האבר ה •הסגורה

נוסחה רקורסיבית נוסחה סגורה

סדרת פיבונאצ'י1, 1, 2, 3, 5, 8, 13,…

a2 = a1 = 1

an = an-1 + an-2

an = (φn - (1 - φ)n) / 5φ = (1+5) / 2 ~= 1.6180כאשר

x2 – x – 1 = 0שהוא שורש של

75

rfib תכנית רקורסיבית לסדרת פיבונאצ'י :

-י בסדרת nלהלן פונקציה רקורסיבית לחישוב האבר ה •פיבונאצ'י על פי ההגדרה.

פונקציה זו מאד לא יעילה: (אקספוננציאלית)•

function f=rfib(n) if n<=2 f=1; else f=rfib(n-1)+rfib(n-2); end

n=6

f = +

76

function f=F(n) if n<=2 f=1; else f=F(n-1)+F(n-2); end

F(6)

F(5) F(4) n=5

f = +F(4) F(3) n=4

f = +F(3) F(2)

n=3

f = +F(2) F(1)

n=2

f = 1

1n=1

f = 1

12

2 n=2

f = 1

1

3

77

rfibהוכחת אקספוננציאליות של באינדוקציה

מספר הפעולות הנדרשות לביצוע Timenיהי

rfib(n) נוכיח . φn<Timen.באינדוקציה

Time1 = 3 > φ1, Time2 = 3 > φ2 בסיס:

.

כרוך בין היתר n הזמן לחשב עבור צעד: n-1 ועבור n-2בקריאה לפונקציה עבור

ולכן:

function f=rfib(n) if n <= 2 f=1; else f=rfib(n-1)+rfib(n-2); end

Timen > Timen-1 + Timen-2

> φn-1 + φn-2 % מהנחת האינדוקציה

> φn-2 (φ + 1)

= φn-2 φ2 %x2 – x – 1 = 0 שורש של φ = φn

78

rfib(n)< מספר העלים = Timen דרך נוספת:

f(2) f(1)

f(3)

f(2) f(1)

f(3) f(2)

f(4)

f(2) f(1)

f(3) f(2)

f(4)f(5)

f(6)

function f=rfib(n) if n<=2 f=1; else f=rfib(n-1)+rfib(n-2); end

f(7)

79

מימוש אינדוקטיבי (תכנון דינאמי) של מספרי פיבונאצ'י

מספר הפעולות הוא לינארי.

.f האברים הראשונים בסדרת פיבונאצ'י בוקטור n חישוב זה שומר את כל

-י בפחות זכרון?nהאם ניתן לחשב את מספר פיבונאצ'י ה

function fib = myfib0(n)% Fibonacci number computationf = zeros(1,n); %memory allocationf(1)=1;f(2)=1; for k=3:n f(k)=f(k-1)+f(k-2);endfib=f(n);

80

תכנון דינאמי

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

מציגים תיאור רקורסיבי לדרך פתרון הבעיה.1.

מגלים כי זמן ריצת האלגוריתם הרקורסיבי (הפועל "מלמעלה למטה") הוא 2.

.אקספוננציאלי

מגלים כי מספר תת-הבעיות הקיימות הוא פולינומי, והסיבה לסיבוכיות 3.

האקספוננציאלית היא קריאות חוזרות לאלגוריתם עבור אותה תת-בעיה.

פותרים את הבעיה על ידי פתרון כל התת-בעיות – ממקרי הקצה שהפתרונות 4.

שלהם ידועים מראש "כלפי מעלה" – עד שמגיעים לבעיה המקורית.

מיון מיזוג

1. function b = msort(a)2. if length(a)<23. b = a;4. return5. end6. m = ceil(length(a)/2);7. b = merge(msort(a(1:m)),

msort(a(m+1:end)));

81

הדגמה (ויקיפדיה)

82

Analyzing merge sort (Silvio Micali MIT)

MERGE-SORT a(1:n)

1. If n < 2, done2. Recursively sort

a(1 : n/2) and a(n/2 + 1 : n)3. “Merge” the two sorted lists

T(n)

O(1)

2T(n/2)

O(n)

T(n) =O(1) if n < 2;

2T(n/2) + O(n) if n > 1.

Recurrence solving (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

T(n)

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

T(n/2) T(n/2)

cn

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

T(n/4) T(n/4) T(n/4) T(n/4)

cn/2 cn/2

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

cn

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

cn

cn

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

cn

cn

cn

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

h = lg n

cn

cn

cn

Q(n)

#leaves = n

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

h = lg n

cn

cn

cn

Q(n)

Total = ?

#leaves = n

Recursion tree (Silvio Micali MIT)

Solve T(n) = 2T(n/2) + cn, where c > 0 is constant.

cn

cn/4 cn/4 cn/4 cn/4

cn/2 cn/2

Q(1)

h = lg n

cn

cn

cn

#leaves = n

O(n)

Total = O(n lg n)

96

תודהתודה תודה

top related