Transcript fib(4)

Özyineleme(Recursion)
• Kendini doğrudan veya dolaylı olarak çağıran
fonksiyonlara özyineli (recursive) fonksiyonlar adı verilir .
• Fonksiyonlar kendi kendilerini çağırabilecekleri gibi
(direct recursion), çağırdıkları bir fonksiyon tarafından da
çağrılabilirler (indirect recursion). Özyineli algoritmalar
hemgüçlü algoritmalardır, hem de karmaşık yapıları
daha rahat açıklayabilirler.
• Iterative algoritma döngü yapısını kullanır. Özyineleme
algoritması dallanma (branching) algoritmasını kullanır.
• Fonksiyon özyineli olarak her çağrılışında yerel
değişkenler ve parametreler için bellekte yer ayrılır.
• Her özyinelemeli olarak tanımlanmış problemin iterative
çözümüne geçiş yapılabilir.
Bileşenler
• Temel durum
• Rekürsif tanımlama
• Temel duruma indirme mekanizması
Tekil(Unary) Özyineleme
function RecursiveFunction ( <parameter(s)> )
{
if ( base case ) then
return base value
else
return RecursiveFunction ( <expression> )
}
Örnek: Faktoriyel:
int factorial ( int n )
{
if ( n <= 1 )
{
return 1;
}
else
{
return n*factorial(n-1);
}
}
Example: Factorial
Factorial(4)
4

Factorial(3)
3

Factorial(2)
2

Factorial(1)
1
Example: Factorial
Factorial(4)
4

Factorial(3)
3

Factorial(2)
2

1
Example: Factorial
Factorial(4)
4

Factorial(3)
3

Factorial(2)
2

1
Example: Factorial
Factorial(4)
4

Factorial(3)
3

2
Example: Factorial
Factorial(4)
4

Factorial(3)
3

2
Example: Factorial
Factorial(4)
4

6
Example: Factorial
Factorial(4)
4

6
Example: Factorial
24
İkili(Binary) Özyineleme
• Kendi kendine iki veya daha fazla cagri vardır.
Ornek – Fibonacci Bir sayilar serisi 0 ve 1 ile
baslar. Sonra gelen hersayi kendinden onceki
iki sayinin toplami
• 0, 1, 1, 2, 3, 5, 8, 13, 21,...
n; eger n < = 1
f(n)
f(n-1) + f(n-2); aksi halde
long fib ( long n )
{
if ( n <= 1 )
return n ;
else
return fib( n - 1 ) + fib( n - 2 );
}
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
+
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
fib(0)
+ fib(1)
+
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
fib(0)
+ fib(1)
+
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
0
+ fib(1)
+
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
0
+ fib(1)
+
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
0
+ fib(1)
+
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
0
+
+
1
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
fib(2)
0
+
+
1
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
fib(1)
+
fib(2)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
fib(1)
+
fib(2)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
fib(2)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
fib(2)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
fib(0)
fib(2)
+ fib(1)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
fib(0)
fib(2)
+ fib(1)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
0
fib(2)
+ fib(1)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
0
fib(2)
+ fib(1)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
0
fib(2)
+ fib(1)
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
fib(2)
0
+
1
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
fib(2)
0
+
1
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
1
0
+
1
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
fib(3)
1
+
1
0
+
1
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
2
1
+
1
0
+
1
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
fib(4)
1
0
+
+
1
2
1
+
1
0
+
1
Example: Computation of fib(4)
• long fib ( long n )
• {
•
if ( n <= 1 )
•
return n ;
•
else
•
return fib( n - 2 ) + fib( n - 1
);
• }
3
1
0
+
+
1
2
1
+
1
0
+
1
Example: Computation of fib(4)
Thus, fib(4) returns the value 3.
3
1
0
+
+
1
2
1
+
1
0
+
1
Tail yineleme:
• Yineleme çağrısı metodun en sonunda yapılır.
• public int recFact(int n)
• {
• if (n<=1) return 1;
• else return n * recFact(n-1);
• }
• public void tail()
• {
• …..
• …..
• …..
• tail();
• }
Nontail yineleme
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
• Yineleme çağrısından sonra başka işlemler yapılır (yazdırma v.b.).
public int nontail(int n)
{
if (n > 0)
{
…….
…….
nontail(n-1);
Console.WriteLine(n);
…….
…….
…….
nontail(n-1);
}
}
Dolaylı (Indirect) yineleme
• Yineleme çağrısı başka bir fonksiyonun
• içinden yapılır.
• void A(int n)
• {
• if (n <= 0) return 1;
• n- -;
• B(n);
• }
• void B(int n)
• {
• if (n <= 0) return 1;
• n- -;
• A(n);
• }
İçiçe (Nested) yineleme
• • Yineleme çağrısı içindende yineleme
çağrısı yapılır.
• public int A(int n, int m)
• {
• if (n <= 0) return 1;
• return A(n-1, A(n-1, m-1));
• }
İkili Arama
•
•
•
binarysearch(int a[],int n,int low,int high)
{
int mid;
•
•
if (low > high) return -1;
mid = (low + high)/2;
•
•
•
if(n == a[mid])
{ printf("The element is at position %d\n",mid+1);
return 0; }
•
•
•
if(n < a[mid])
{ high = mid - 1;
binarysearch(a,n,low,high); }
•
•
•
•
if(n > a[mid])
{ low = mid + 1;
binarysearch(a,n,low,high); }
}
Bağlı Liste Tersten Yazdırma
•
•
•
•
•
•
void print(Elem *list)
{ if (list != NULL)
{print(list->next);
cout>>list->bilgi;
}
}
Hızlı Sıralama
Quicksort örnek
•
Sort the array containing:
9
4251
Partition
Partition
Concatenate
Concatenate
Concatenate
21
1
4
2
1 2
4
5 17
16 4 15 2
<
Pivot
9
<
1
16 15 17
5
15
16 17
5
15
17
5
15 16 17
1 2 4 5 9 15 16 17
Birleştirmeli Sıralama
MergeSort Örnek
0
1
2
3
4
5
6
7
8
2
9
4
5
3
1
6
Divide
8 2 9 4
Divide
Divide
1 element 8
Merge
8 2
5 3 1 6
9 4
2
2 8
5 3
4
9
4 9
1 6
3
5
3 5
1 6
Merge
2 4 8 9
1 3 5 6
Merge
Sorted Array
1 2 3 4 5 6 8 9
6
1
Hanoi Kulesi
• Üç kule (A,B,C) olan bir sistemde yarıçapı birbirinden farklı 4 tane
diskin A kulesine yerleştirilir.
• Kurallar :
• Bir diskin altında yarıçapı daha küçük bir disk bulunamaz. Bir diskin
üzerine yarıçapı daha büyük bir disk yerleştirilemez.
• Bir anda bir kulenin sadece en üstündeki disk diğer bir kuleye
yerleştirilebilir. Bir anda bir disk hareket ettirilebilir.
• Problemde istenen : B direğinden de yararlanarak tüm disklerin C’ye
yerleştirilmesi.