Рекурс Rosen 5 th  ed., §3.4-3.5
Рекурс Заримдаа объектыг тодорхой байдлаар тодорхойлход хүнд байдаг.  Рекурс нь өөрийсөө объект тодорхойлдог процесс юм.  ( эсвэл өөрийн хэсгээс ). Рекурсыг дараахыг тодорхойлход ашиглаж болно :  Функц Дараалал Олонлог  Асуудал Алгоритм
Рекурс болон Индукц Бид объектыг төгсгөлөг элементтэй  том хэмжээний объектоос жижиг хэмжээний нэгийг  ( ж.н функц таамаглал болон олнлог )  тодорхойлход  рекурсыг хэрэглэгдэг.  Индукцд бид төгсгөлөг олонлогийн бүх гишүүн болох  P  өгүүлхүүний өмнөх жижиг хэмжээний бүх өгүүлхүүн үнэнг батладаг
Рекурслэг тодорхойлогдсон функц Функцийг тодорхойлох нэг арга нь   f : N  S  ( дурын  S   олонлог )  эсвэл  a n = f ( n )  цуваа нь : f (0)  тодорхойлно . n >0,  f ( n )  – ийг  f (0),…, f ( n −1)  хэлбрээр  тодорхойлно  . Ж.н . :  a n  :≡   2 n   цувааг рекурслэг тодрхойлохдоо : a 0  :≡   1  гэвэл . n >0,  a n   :≡   2 a n -1  гэнэ.
Фибоначийн цуваа Fibonacci  цуваа нь  f n ≥0   тодорхойлох түгээмэл арга юм : f 0  :≡ 0,  f 1  :≡ 1,  f n ≥2  :≡  f n −1  +  f n −2 Leonardo Fibonacci 1170-1250 0 1 1 2 3 5 8 13
Рекурс тодорхойлоход батлах шинж чанарууд Теорем :  f n  <  2 n . Баталгаа :   индукцээр . Үндсэн хэсэг : f 0  = 0 < 2 0  = 1 f 1  = 1 < 2 1  = 2  Инд алхам :  гүн индукцээр .   k < n ,  f k  <  2 k  гэж авч үзвэл.   f n  =  f n −1  +  f n −2   бол   < 2 n −1  + 2 n −2  < 2 n −1  + 2 n −1  = 2 n .  ■ Рекурс баталгааны үндсэн хэсгийг ашигласан . Шууд бусаар бүх  n  N
Рекурслэг тодорхойлогдсон олонлог Төгсгөлөг олонлог  S   нь рекурслэг байдлаар өгөгдсөн бол : Жижиг төгсгөлөг олонлогын үндсэн элемент  S . Дүрэм шинэ элементийг өмнө нь тодорхойлсон  S   – ээс байгуулах. Шууд бусаар  ,  S   нь өөр элементүүд байна гэхдээ дээрх элемент биш. Жишээ :  3  S  гэе ,  мөн  x + y  S   ба хэрэв   x , y  S   бол .   S  юу вэ ?
Рекурсын асуудал болон алгоритм  (§3.5) Заримдаа асуудал шийдэх зам нь жижиг хэлбэр нь ижил байдаг . Рекурс бол жижиг асуудлыг ижил хэлбэрээр шийддэг арга барил юм.
Рекурс тодорхойлох асуудал Рекурсыг тодорхойлоход олон асуудал тулгардаг : Жишээ :  n  факториал 1 if  n  = 0 n !=   ( рекурс шийдэл ) ( n -1)!* n if  n  > 0 1 if  n  = 0 n !=   ( шийдлийг дуусгах ) 1*2*3*…*( n -1)* n if  n  > 0
Факториал функцийн код Рекурс хэрэгжилт int Factorial(int n) { if (n==0)  //  үндсэн хэсэг return 1; else return n * Factorial(n-1); }
 
Өөр жишээ :  n   –ээс  k  –г сонгох  ( комбинаци )   n   зүйл өгөгдсөн ба к хэмжээгээр сонгож авах хичнээн өөр олонлог байх вэ ? n   n-1   n-1   =   +   ,  1 < k < n ( рекурс шийдэл ) k   k   k-1 n   n!   =   ,  1 < k < n ( дуусгах хэлбэр ) k   k!(n-k)! үндсэн хэсэг : n   n   = n  (k = 1),  = 1  (k = n) 1   n
n   –ээс  k  –г сонгох  ( комбинаци ) int Combinations(int n, int k) { if(k == 1)  //  үндсэн хэсэг  1 return n; else if (n == k)  //  үндсэн хэсэг  2 return 1; else return(Combinations(n-1, k) + Combinations(n-1, k-1)); }
n   –ээс  k  –г сонгох  ( комбинаци )
Хэрхэн яаж рекурс функцийг бичих вэ ? Хэмжээг  тодорхойлох Үндсэн хэсгүүдийг  тодорхойлох ( асуусан асуултанд хариулж байна уу? ) Ерөнхий хэсгийг  тодорхойлох   Алгоритмыг  шалгах ( дараах “3асуултаар алгоритмыг шалгана &quot;)
Шалгах 3 асуулт Үндсэн хэсгийн асуулт : Тэнд рекурс шийдлээс гадуур функцийг шийлэж байна уу? Энэ үндсэн хэсэг нь зөв ажиллах уу?    Жижиг хэсгийг дуудах асуулт : Рекурс дуудлага бүр нь жинхэнэ асуудлыг шийдэх дуудлага мөн үү?  Ерөнхий хэсгийн асуулт : Авч үзэж буй дуудлага бүр нь энэ функцд зөв ажилж байна уу?
a n  Рекурсээр тооцоолох Зарим зүйлын алгоритм зөн совингоороо олон удаа давтагддаг эдгээрийг ч бас рекурсээр илэрхийлж болно.  процедур  power ( a≠ 0: real,  n  N ) if   n  = 0  then return  1 else   return   a  ·  power ( a ,  n −1)
Шугаман рекурс хайлт Жишээ procedure   search ( i, j, x ) if   =x   then  location:= i   else if  i=j  then location:=0   else   search ( i+1, j, x ) .... i j
2тын рекурс хайлт Факторын хэмжээ хэр их вэ ? элементийн тоо нь  ( info[first] ... info[last] ) Үндсэн хэсэг нь юу вэ ?   (1)  хэрэв  first > last , return  false   (2)  хэрэв  item==info[midPoint] , return  true Ерөнхий хэсэг нь юу вэ ? хэрэв  item < info[midPoint]  эхний хагасыг хайх хэрэв  item > info[midPoint] ,  үлдсэн хагасыг хайх
2тын рекурс хайлт bool  BinarySearch (A[], item, first, last) { int midPoint;   if(first > last)  //  үндсэн хэсэг  1 return false; else { midPoint = (first + last)/2; if(item < A[midPoint]) return BinarySearch(A, item, first, midPoint-1); else if (item == A[midPoint]) {  //  үндсэн хэсэг  2 item = A[midPoint]; return true; } else return BinarySearch(A, item, midPoint+1, last); } }
Divide and Conquer
MergeSort
MergeSort ( үргэлжлэл )
MergeSort ( үргэлжлэл ) The merge takes  Θ ( n ) steps, and merge-sort takes  Θ ( n  log  n ).
Рекурс алгоритмын үр ашиг Хугацаа болон зайг нийтэд нь рекурс алгоритм шийддэг.  Дараах функцийг дуудхад юу болох вэ ? int f(int x) { int y;   if(x==0) return 1; else { y = 2 * f(x-1); return y+1; } }
=f(3) =f(2) =f(1) 2*f(2) 2*f(1) 2*f(1) =f(0)
Рекурс болон давталт Рекурст давталтыг ашиглаж болно. Давталтат алгоритм нь зангилааны бүтэцтэй.  looping construct Рекурс алгоритм нь мөчрөн бүтэцтэй.  branching structure Рекурс шийдэл нь заримдаа давталтаас илүү  хугацаа  болон  зай  шаарддаг.  Рекурс нь асуудлыг энгийн байдлаар шийддэг, ихэнхдээ үр дүнг  богино хэмжээний  гаргадаг мөн эх кодыг ойлгоход хялбар байдаг.
Зарим тохиолдолд рекурс нь үр ашиггүй байдаг. 15
Хэзээ Рекурсыг ашиглах вэ? Рекурс дуудалтын  гүн нь харцангуй хязгаарлагдмал  байхад.  Рекурс нь Рекурс биш дуудалттай  ижил үр дүнг, ажиллагааг  харуулж байхад. The Рекурс биш дуудалтаас  бага энгийн  үед рекурсыг дуудах.

Bvleg 6 recursion

  • 1.
    Рекурс Rosen 5th ed., §3.4-3.5
  • 2.
    Рекурс Заримдаа объектыгтодорхой байдлаар тодорхойлход хүнд байдаг. Рекурс нь өөрийсөө объект тодорхойлдог процесс юм. ( эсвэл өөрийн хэсгээс ). Рекурсыг дараахыг тодорхойлход ашиглаж болно : Функц Дараалал Олонлог Асуудал Алгоритм
  • 3.
    Рекурс болон ИндукцБид объектыг төгсгөлөг элементтэй том хэмжээний объектоос жижиг хэмжээний нэгийг ( ж.н функц таамаглал болон олнлог ) тодорхойлход рекурсыг хэрэглэгдэг. Индукцд бид төгсгөлөг олонлогийн бүх гишүүн болох P өгүүлхүүний өмнөх жижиг хэмжээний бүх өгүүлхүүн үнэнг батладаг
  • 4.
    Рекурслэг тодорхойлогдсон функцФункцийг тодорхойлох нэг арга нь f : N  S ( дурын S олонлог ) эсвэл a n = f ( n ) цуваа нь : f (0) тодорхойлно . n >0, f ( n ) – ийг f (0),…, f ( n −1) хэлбрээр тодорхойлно . Ж.н . : a n :≡ 2 n цувааг рекурслэг тодрхойлохдоо : a 0 :≡ 1 гэвэл . n >0, a n :≡ 2 a n -1 гэнэ.
  • 5.
    Фибоначийн цуваа Fibonacci цуваа нь f n ≥0 тодорхойлох түгээмэл арга юм : f 0 :≡ 0, f 1 :≡ 1, f n ≥2 :≡ f n −1 + f n −2 Leonardo Fibonacci 1170-1250 0 1 1 2 3 5 8 13
  • 6.
    Рекурс тодорхойлоход батлахшинж чанарууд Теорем : f n < 2 n . Баталгаа : индукцээр . Үндсэн хэсэг : f 0 = 0 < 2 0 = 1 f 1 = 1 < 2 1 = 2 Инд алхам : гүн индукцээр .  k < n , f k < 2 k гэж авч үзвэл. f n = f n −1 + f n −2 бол < 2 n −1 + 2 n −2 < 2 n −1 + 2 n −1 = 2 n . ■ Рекурс баталгааны үндсэн хэсгийг ашигласан . Шууд бусаар бүх n  N
  • 7.
    Рекурслэг тодорхойлогдсон олонлогТөгсгөлөг олонлог S нь рекурслэг байдлаар өгөгдсөн бол : Жижиг төгсгөлөг олонлогын үндсэн элемент S . Дүрэм шинэ элементийг өмнө нь тодорхойлсон S – ээс байгуулах. Шууд бусаар , S нь өөр элементүүд байна гэхдээ дээрх элемент биш. Жишээ : 3  S гэе , мөн x + y  S ба хэрэв x , y  S бол . S юу вэ ?
  • 8.
    Рекурсын асуудал болоналгоритм (§3.5) Заримдаа асуудал шийдэх зам нь жижиг хэлбэр нь ижил байдаг . Рекурс бол жижиг асуудлыг ижил хэлбэрээр шийддэг арга барил юм.
  • 9.
    Рекурс тодорхойлох асуудалРекурсыг тодорхойлоход олон асуудал тулгардаг : Жишээ : n факториал 1 if n = 0 n != ( рекурс шийдэл ) ( n -1)!* n if n > 0 1 if n = 0 n != ( шийдлийг дуусгах ) 1*2*3*…*( n -1)* n if n > 0
  • 10.
    Факториал функцийн кодРекурс хэрэгжилт int Factorial(int n) { if (n==0) // үндсэн хэсэг return 1; else return n * Factorial(n-1); }
  • 11.
  • 12.
    Өөр жишээ : n –ээс k –г сонгох ( комбинаци ) n зүйл өгөгдсөн ба к хэмжээгээр сонгож авах хичнээн өөр олонлог байх вэ ? n n-1 n-1 = + , 1 < k < n ( рекурс шийдэл ) k k k-1 n n! = , 1 < k < n ( дуусгах хэлбэр ) k k!(n-k)! үндсэн хэсэг : n n = n (k = 1), = 1 (k = n) 1 n
  • 13.
    n –ээс k –г сонгох ( комбинаци ) int Combinations(int n, int k) { if(k == 1) // үндсэн хэсэг 1 return n; else if (n == k) // үндсэн хэсэг 2 return 1; else return(Combinations(n-1, k) + Combinations(n-1, k-1)); }
  • 14.
    n –ээс k –г сонгох ( комбинаци )
  • 15.
    Хэрхэн яаж рекурсфункцийг бичих вэ ? Хэмжээг тодорхойлох Үндсэн хэсгүүдийг тодорхойлох ( асуусан асуултанд хариулж байна уу? ) Ерөнхий хэсгийг тодорхойлох Алгоритмыг шалгах ( дараах “3асуултаар алгоритмыг шалгана &quot;)
  • 16.
    Шалгах 3 асуултҮндсэн хэсгийн асуулт : Тэнд рекурс шийдлээс гадуур функцийг шийлэж байна уу? Энэ үндсэн хэсэг нь зөв ажиллах уу?   Жижиг хэсгийг дуудах асуулт : Рекурс дуудлага бүр нь жинхэнэ асуудлыг шийдэх дуудлага мөн үү? Ерөнхий хэсгийн асуулт : Авч үзэж буй дуудлага бүр нь энэ функцд зөв ажилж байна уу?
  • 17.
    a n Рекурсээр тооцоолох Зарим зүйлын алгоритм зөн совингоороо олон удаа давтагддаг эдгээрийг ч бас рекурсээр илэрхийлж болно. процедур power ( a≠ 0: real, n  N ) if n = 0 then return 1 else return a · power ( a , n −1)
  • 18.
    Шугаман рекурс хайлтЖишээ procedure search ( i, j, x ) if =x then location:= i else if i=j then location:=0 else search ( i+1, j, x ) .... i j
  • 19.
    2тын рекурс хайлтФакторын хэмжээ хэр их вэ ? элементийн тоо нь ( info[first] ... info[last] ) Үндсэн хэсэг нь юу вэ ? (1) хэрэв first > last , return false (2) хэрэв item==info[midPoint] , return true Ерөнхий хэсэг нь юу вэ ? хэрэв item < info[midPoint] эхний хагасыг хайх хэрэв item > info[midPoint] , үлдсэн хагасыг хайх
  • 20.
    2тын рекурс хайлтbool BinarySearch (A[], item, first, last) { int midPoint;   if(first > last) // үндсэн хэсэг 1 return false; else { midPoint = (first + last)/2; if(item < A[midPoint]) return BinarySearch(A, item, first, midPoint-1); else if (item == A[midPoint]) { // үндсэн хэсэг 2 item = A[midPoint]; return true; } else return BinarySearch(A, item, midPoint+1, last); } }
  • 21.
  • 22.
  • 23.
  • 24.
    MergeSort ( үргэлжлэл) The merge takes Θ ( n ) steps, and merge-sort takes Θ ( n log n ).
  • 25.
    Рекурс алгоритмын үрашиг Хугацаа болон зайг нийтэд нь рекурс алгоритм шийддэг. Дараах функцийг дуудхад юу болох вэ ? int f(int x) { int y;   if(x==0) return 1; else { y = 2 * f(x-1); return y+1; } }
  • 26.
    =f(3) =f(2) =f(1)2*f(2) 2*f(1) 2*f(1) =f(0)
  • 27.
    Рекурс болон давталтРекурст давталтыг ашиглаж болно. Давталтат алгоритм нь зангилааны бүтэцтэй. looping construct Рекурс алгоритм нь мөчрөн бүтэцтэй. branching structure Рекурс шийдэл нь заримдаа давталтаас илүү хугацаа болон зай шаарддаг. Рекурс нь асуудлыг энгийн байдлаар шийддэг, ихэнхдээ үр дүнг богино хэмжээний гаргадаг мөн эх кодыг ойлгоход хялбар байдаг.
  • 28.
    Зарим тохиолдолд рекурснь үр ашиггүй байдаг. 15
  • 29.
    Хэзээ Рекурсыг ашиглахвэ? Рекурс дуудалтын гүн нь харцангуй хязгаарлагдмал байхад. Рекурс нь Рекурс биш дуудалттай ижил үр дүнг, ажиллагааг харуулж байхад. The Рекурс биш дуудалтаас бага энгийн үед рекурсыг дуудах.