<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FAlgorytmy_i_struktury_danych%2FRekurencja</id>
	<title>TI/Algorytmy i struktury danych/Rekurencja - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=TI%2FAlgorytmy_i_struktury_danych%2FRekurencja"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Rekurencja&amp;action=history"/>
	<updated>2026-04-24T21:42:31Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Rekurencja&amp;diff=1934&amp;oldid=prev</id>
		<title>Jarekz: /* Wyszukiwanie binarne */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Rekurencja&amp;diff=1934&amp;oldid=prev"/>
		<updated>2015-05-23T13:46:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Wyszukiwanie binarne&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 13:46, 23 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l139&quot; &gt;Linia 139:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 139:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Wyszukiwanie binarne==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Wyszukiwanie binarne==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Szukanie za pomocą bisekcji jest jednym z najbardziej intuicyjnych sposobów szukania wartości w uporządkowanym wektorze, czy sekwencji.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Szukanie za pomocą bisekcji jest jednym z najbardziej intuicyjnych sposobów szukania wartości w uporządkowanym wektorze, czy sekwencji.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wyobraź sobie, że musisz znaleźć liczbę 54 w sekwencji składającej się z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; liczb od 1 do 90. Zgadywałbyś zapewne, że 54 jest to element &amp;lt;math&amp;gt;\&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;nicefrac&lt;/del&gt;{N}{2}&amp;lt;/math&amp;gt;. Jeżeli nie trafisz, sprawdzisz, czy wybrany element jest większy, czy mniejszy od 54. Jeżeli jest mniejszy, poszukasz go w połowie lewej części sekwencji. Jeżeli jest większy, poszukasz go w połowie prawej części sekwencji. Tak jak na rysunku:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wyobraź sobie, że musisz znaleźć liczbę 54 w sekwencji składającej się z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; liczb od 1 do 90. Zgadywałbyś zapewne, że 54 jest to element &amp;lt;math&amp;gt;\&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;frac&lt;/ins&gt;{N}{2}&amp;lt;/math&amp;gt;. Jeżeli nie trafisz, sprawdzisz, czy wybrany element jest większy, czy mniejszy od 54. Jeżeli jest mniejszy, poszukasz go w połowie lewej części sekwencji. Jeżeli jest większy, poszukasz go w połowie prawej części sekwencji. Tak jak na rysunku:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[File:Dsa_bin_search.svg|thub|Przykład wyszukiwania binarnego]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[File:Dsa_bin_search.svg|thub|Przykład wyszukiwania binarnego]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l160&quot; &gt;Linia 160:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 160:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Zadanie===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Zadanie===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Rozwiąż ten problem iteracyjnie.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Rozwiąż ten problem iteracyjnie.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Wieże Hanoi==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Wieże Hanoi==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Rekurencja&amp;diff=1929&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot; = Rekurencja =  Rekurencja polega na rozwiązywaniu problemów przy następującym spostrzeżeniu:  gdybyśmy mieli rozwiązanie danego problemu dla mniejszej liczby da...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Algorytmy_i_struktury_danych/Rekurencja&amp;diff=1929&amp;oldid=prev"/>
		<updated>2015-05-23T13:43:35Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot; = Rekurencja =  Rekurencja polega na rozwiązywaniu problemów przy następującym spostrzeżeniu:  gdybyśmy mieli rozwiązanie danego problemu dla mniejszej liczby da...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Rekurencja =&lt;br /&gt;
&lt;br /&gt;
Rekurencja polega na rozwiązywaniu problemów przy następującym spostrzeżeniu: &lt;br /&gt;
gdybyśmy mieli rozwiązanie danego problemu dla mniejszej liczby danych, to rozwiązanie dla obecnej byłoby banalne. Łatwo to zobaczyć na poniższym przykładzie z obliczaniem silni:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Przykład &amp;amp;mdash; obliczanie silni ===&lt;br /&gt;
Silnia przedstawia się następującą zależnością matematyczną:&lt;br /&gt;
::&amp;lt;math&amp;gt;n! = \prod_{k=1}^n k&amp;lt;/math&amp;gt;&lt;br /&gt;
====Rekurencyjnie====&lt;br /&gt;
Silnię można zapisać jako równanie rekurencyjne:&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix} &amp;amp;b_n = n\cdot b_{n-1}\\ &lt;br /&gt;
&amp;amp;b_0  = 1\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
Jak wygląda to w praktyce? Zobaczmy, co dzieje się, gdy chcemy obliczyć &amp;lt;math&amp;gt;b_4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Rekurencyjne obliczanie silni dla n = 4:&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
 b&amp;lt;sub&amp;gt;4&amp;lt;/sub&amp;gt;           = 4 * b&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
              = 4 * 3 * b&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
              = 4 * 3 * 2 * b&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
              = 4 * 3 * 2 * 1 * b&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;&lt;br /&gt;
              = 4 * 3 * 2 * 1 * 1&lt;br /&gt;
              = 4 * 3 * 2 * 1&lt;br /&gt;
              = 4 * 3 * 2&lt;br /&gt;
              = 4 * 6&lt;br /&gt;
              = 24&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jak zapiszemy to równanie rekurencyjne w Pythonie?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def silnia(n):&lt;br /&gt;
    if n == 0:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return n*silnia(n-1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Iteracyjnie====&lt;br /&gt;
Silnię można oczywiście obliczyć iteracyjnie, co jest daleko bardziej wydajne.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def silnia(n):&lt;br /&gt;
    silnia = 1&lt;br /&gt;
    for i in xrange(2, n+1):&lt;br /&gt;
        silnia *= i&lt;br /&gt;
    return silnia&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Przerywnik ===&lt;br /&gt;
&lt;br /&gt;
Uruchom teraz silnia(999) i silnia(998). Co zauważasz?&lt;br /&gt;
W pythonie jest domyślnie ustawione ograniczenie na głębokość stosu wykonania programu = 1000. Limit ten można zmienić w następujący sposób:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
sys.setrecursionlimit(1500)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ale też nie w nieskończoność.&lt;br /&gt;
Żeby uniknąć takich problemów, optymalizuje się programy rekurencji tak, aby stosować tzw rekurencję ogonową:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def even(x):&lt;br /&gt;
  if x == 0:&lt;br /&gt;
    return True&lt;br /&gt;
  else:&lt;br /&gt;
    return odd(x - 1)&lt;br /&gt;
&lt;br /&gt;
def odd(x):&lt;br /&gt;
  if x == 0:&lt;br /&gt;
    return False&lt;br /&gt;
  else:&lt;br /&gt;
    return even(x - 1)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def tail_rec(fun):&lt;br /&gt;
   def tail(fun):&lt;br /&gt;
      a = fun&lt;br /&gt;
      while callable(a):&lt;br /&gt;
         a = a()&lt;br /&gt;
      return a&lt;br /&gt;
   return (lambda x: tail(fun(x)))&lt;br /&gt;
&lt;br /&gt;
def tail_even(x):&lt;br /&gt;
  if x == 0:&lt;br /&gt;
    return True&lt;br /&gt;
  else:&lt;br /&gt;
    return (lambda: tail_odd(x - 1))&lt;br /&gt;
&lt;br /&gt;
def tail_odd(x):&lt;br /&gt;
  if x == 0:&lt;br /&gt;
    return False&lt;br /&gt;
  else:&lt;br /&gt;
    return (lambda: tail_even(x - 1))&lt;br /&gt;
&lt;br /&gt;
even = tail_rec(tail_even)&lt;br /&gt;
odd = tail_rec(tail_odd)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Do czego rekurencja będzie wygodna? ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;korzen litera=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;lewy litera=&amp;quot;b&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;lewy litera=&amp;quot;a&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/lewy&amp;gt;&lt;br /&gt;
 		&amp;lt;prawy litera=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/prawy&amp;gt;&lt;br /&gt;
 	&amp;lt;/lewy&amp;gt;&lt;br /&gt;
 	&amp;lt;prawy litera=&amp;quot;f&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;lewy litera=&amp;quot;e&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/lewy&amp;gt;&lt;br /&gt;
 		&amp;lt;prawy litera=&amp;quot;g&amp;quot;&amp;gt;&lt;br /&gt;
 		&amp;lt;/prawy&amp;gt;&lt;br /&gt;
 	&amp;lt;/prawy&amp;gt;&lt;br /&gt;
 &amp;lt;/korzen&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Napisz program, który wczyta następujące drzewo xml i wypisze je w porządku infiksowym. &lt;br /&gt;
* Napisz program, który z zadanego ciągu znaków utworzy analogiczne drzewo xml, tak, aby po wypisaniu go w porzadku infiksowym otrzymać wyjściowy ciąg znaków. &lt;br /&gt;
* Spróbuje oba problemu rozwiązać zarówno iteracyjnie, jak rekurencyjnie. Ile linii kodu zajęło Ci rozwiązanie iteracyjne, a ile rekurencyjne? Ile razy szybciej udało Ci się napisać rozwiązanie rekurencyjnie? Ile razy pomyliłeś się pisząc rozwiązanie iteracyjne, a ile rekurencyjne?&lt;br /&gt;
&lt;br /&gt;
==Ciąg Fibonacciego==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def fibonacci(n):&lt;br /&gt;
    if n == 0 or n == 1:&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return fibonacci(n-1) + fibonacci(n-2)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:fib_1_galaz.svg|thumb|&amp;lt;figure id=&amp;quot;fig:fib_1_galaz&amp;quot;/&amp;gt;Ciągu Fibonacciego  od liczby 4 &amp;amp;mdash; schemat wywołań funkcji w pierwszej gałęzi.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wyszukiwanie binarne==&lt;br /&gt;
Szukanie za pomocą bisekcji jest jednym z najbardziej intuicyjnych sposobów szukania wartości w uporządkowanym wektorze, czy sekwencji.&lt;br /&gt;
Wyobraź sobie, że musisz znaleźć liczbę 54 w sekwencji składającej się z &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; liczb od 1 do 90. Zgadywałbyś zapewne, że 54 jest to element &amp;lt;math&amp;gt;\nicefrac{N}{2}&amp;lt;/math&amp;gt;. Jeżeli nie trafisz, sprawdzisz, czy wybrany element jest większy, czy mniejszy od 54. Jeżeli jest mniejszy, poszukasz go w połowie lewej części sekwencji. Jeżeli jest większy, poszukasz go w połowie prawej części sekwencji. Tak jak na rysunku:&lt;br /&gt;
&lt;br /&gt;
[[File:Dsa_bin_search.svg|thub|Przykład wyszukiwania binarnego]]&lt;br /&gt;
&lt;br /&gt;
Jeżeli w którymś momencie lewa granica sekwencji okaże się większa niż prawa, podzieliłeś sekwencję na 2 o raz za dużo i nie masz już w czym szukać. Zwracasz wtedy -1, na znak tego, że nie znalazłeś.&lt;br /&gt;
&lt;br /&gt;
Rozwiązanie rekurencyjne tego algorytmu jest intuicyjne i sprowadza się do zapisu w poleceniami powyżej opisanej procedury. Poniżej kod w Pythonie.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def znajdz(lista, lewy, prawy, x):&lt;br /&gt;
    if lewy&amp;gt;prawy:&lt;br /&gt;
        raise IndexError&lt;br /&gt;
    srodek = (lewy + prawy) / 2&lt;br /&gt;
    if lista[srodek] == x:&lt;br /&gt;
        return srodek&lt;br /&gt;
    if lista[srodek] &amp;gt; x:&lt;br /&gt;
        return znajdz(lista, lewy, srodek - 1, x)&lt;br /&gt;
    else:&lt;br /&gt;
        return znajdz(lista, srodek + 1, prawy, x)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Zadanie===&lt;br /&gt;
Rozwiąż ten problem iteracyjnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wieże Hanoi==&lt;br /&gt;
[[Plik:Tower of Hanoi.jpeg|thumb|300px|&amp;lt;figure id=&amp;quot;fig:hanoi1&amp;quot;/&amp;gt;Wieże Hanoi: Od lewej: słupek A z całą wieżą, pusty słupek B pełniący rolę bufora i pusty słupek docelowy C.]]&lt;br /&gt;
Wieże Hanoi są łamigłówką matematyczną przypominającą dziecięcą zabawkę. Tak, jak na rysunku &amp;lt;xr  id=&amp;quot;fig:hanoi1&amp;quot;/&amp;gt; mamy trzy słupki, oznaczone A, B i C. Na słupku A znajduje się wieża &amp;amp;mdash; ułożone na sobie dyski, o zmniejszającej się średnicy. Słupki B &amp;amp;mdash; pełniący rolę bufora; i C &amp;amp;mdash; będący słupkiem docelowym; są puste. Zadanie polega na przeniesieniu całej wieży ze słupka A na słupek C, zachowując zależność im wyższy dysk, tym mniejsza jego średnica, posługując  się słupkiem B jako buforem. Dodatkowo:&lt;br /&gt;
* W każdym kroku można przenieść tylko jeden dysk.&lt;br /&gt;
* Krok polega na przeniesieniu dysku z wybranego słupka na inny słupek i umieszczeniu go na dyskach, które znajdują się na danym słupku.&lt;br /&gt;
* Dysk o większej średnicy nigdy nie może znaleźć się nad dyskiem o mniejszej średnicy.&lt;br /&gt;
&lt;br /&gt;
===Rozwiązanie rekurencyjne===&lt;br /&gt;
Jest banalnie proste.&lt;br /&gt;
*Przenieść wieżę z &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dysków ze słupka A na słupek B.&lt;br /&gt;
*Przenieść jeden dysk na słupek C.&lt;br /&gt;
*Przenieść wieżę z &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; dysków ze słupka B na słupek C.&lt;br /&gt;
===Rozwiązanie iteracyjne===&lt;br /&gt;
[[File:Tower_of_Hanoi_4.gif|thumb|300px|&amp;lt;figure id=&amp;quot;fig:hanoi2&amp;quot;/&amp;gt;Wieże Hanoi: Animacja pokazująca rozwiązanie łamigówki.]]&lt;br /&gt;
Rozwiązanie takiego problemu z wieżą o czterech dyskach można zobaczyć na animacji na rysunku &amp;lt;xr id=&amp;quot;fig:hanoi2&amp;quot;/&amp;gt;.&lt;br /&gt;
*Na początku należy przenieść najszerszy dysk &amp;amp;mdash; pomarańczowy, ze słupka A na słupek C. W tym celu:&lt;br /&gt;
**czerwony na B,&lt;br /&gt;
**żółty na C,&lt;br /&gt;
**czerwony na C,&lt;br /&gt;
**niebieski na B,&lt;br /&gt;
**czerwony na A,&lt;br /&gt;
**żółty na B,&lt;br /&gt;
**czerwony na B.&lt;br /&gt;
*Uwolniony pomarańczowy jest na słupku A. Słupek C jest wolny. Pomarańczowy przechodzi na C.&lt;br /&gt;
*Teraz należy przenieść niebieski na C.&lt;br /&gt;
**czerwony na C,&lt;br /&gt;
**żółty na A,&lt;br /&gt;
**czerwony na A.&lt;br /&gt;
*Uwolniony niebieski jest na słupku B. Na słupku C jest wyłącznie pomarańczowy. Niebieski przechodzi na C.&lt;br /&gt;
*Teraz należy przenieść żółty na C.&lt;br /&gt;
**czerwony na B.&lt;br /&gt;
*Żółty jest wolny na A, można go przenieść na C.&lt;br /&gt;
*Czerwony zostaje przeniesiony na C.&lt;br /&gt;
Łamigłówkę udało się rozwiązać.&lt;br /&gt;
&lt;br /&gt;
====Algorytm iteracyjny====&lt;br /&gt;
#W przypadku parzystej liczby krążków:&lt;br /&gt;
#*wykonaj dozwolone przeniesienie pomiędzy słupkami A i B,&lt;br /&gt;
#*wykonaj dozwolone przeniesienie pomiędzy słupkami A i C,&lt;br /&gt;
#*wykonaj dozwolone przeniesienie pomiędzy słupkami B i C,&lt;br /&gt;
#*powtarzaj, aż przeniesiesz wszystkie.&lt;br /&gt;
#W przypadku nieparzystej liczby krążków:&lt;br /&gt;
#*wykonaj dozwolone przeniesienie pomiędzy słupkami A i C,&lt;br /&gt;
#*wykonaj dozwolone przeniesienie pomiędzy słupkami A i B,&lt;br /&gt;
#*wykonaj dozwolone przeniesienie pomiędzy słupkami B i C,&lt;br /&gt;
#*powtarzaj, aż przeniesiesz wszystkie.&lt;br /&gt;
&lt;br /&gt;
Wykonano &amp;lt;math&amp;gt;2^n-1\;&amp;lt;/math&amp;gt; ruchów.&lt;br /&gt;
&lt;br /&gt;
Jak widać opis rekurencyjny jest prostszy niż iteracyjny.&lt;br /&gt;
&lt;br /&gt;
===Zadanie===&lt;br /&gt;
Napisz program, który implementuje algorytm iteracyjny i rekurencyjny. Załóż, że słupki A, B i C są listami. Lista A jest wypełniona &amp;quot;dyskami&amp;quot; &amp;amp;mdash; liczbami albo słowami, listy B i C są puste.&lt;br /&gt;
Sprawdź swój program na dwóch zestawach danych:&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;A1 =['duzy', 'sredni', 'maly']&amp;lt;/source&amp;gt;&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;A2 =['bardzo duzy', 'duzy', 'sredni', 'maly', 'bardzo maly']&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zadania różne ==&lt;br /&gt;
&lt;br /&gt;
Rozwiąż [http://wazniak.mimuw.edu.pl/index.php?title=Wst%C4%99p_do_programowania/Rekursja/%C4%86wiczenia następujące zadania]&lt;br /&gt;
&lt;br /&gt;
==Wyznacznik macierzy (obliczany z definicji)==&lt;br /&gt;
[[Plik:Macierz.svg|right]]&lt;br /&gt;
&lt;br /&gt;
'''Napisz funkcję'''&lt;br /&gt;
&amp;lt;source lang='py'&amp;gt;&lt;br /&gt;
def wyznacznik_1(macierz):&lt;br /&gt;
     &amp;quot;Oblicza wyznacznik korzystając z definicji.&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
która oblicza wyznacznik macierzy &amp;lt;tt&amp;gt;macierzy&amp;lt;/tt&amp;gt; korzystając z rekurencyjnej&lt;br /&gt;
definicji wyznacznika.&lt;br /&gt;
&lt;br /&gt;
'''Przypomnienie''': jeśli &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; jest macierzą kwadratową o wymiarze &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;,&lt;br /&gt;
to jej wyznacznik wynosi&lt;br /&gt;
:&amp;lt;math&amp;gt;\left|M\right| = \sum_{k=1}^n(-)^{i+k} a_{ik} \left|M_{/i/k}\right|&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; jest dowolne, a &amp;lt;math&amp;gt;M_{/i/k}&amp;lt;/math&amp;gt; oznacza macierz o wymiarze zmniejszonym o 1 przez wykasowanie wiersza &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; oraz kolumny &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Sprawdź swoją funkcję na macierzy jednostkowej różnych rozmiarów, na macierzy wypełnionej jedynkami lub zerami i na paru małych macierzach dla których jesteś w stanie samemu policzyć wynik.&lt;br /&gt;
&lt;br /&gt;
'''Uwaga o funkcjach rekurencyjnych'''&amp;lt;br&amp;gt;&lt;br /&gt;
Funkcje mogą wywoływać same siebie. Funkcja &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; może&lt;br /&gt;
też wywoływać inne funkcje, które wywołają &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; jeszcze raz. Tak czy inaczej, w pewnym&lt;br /&gt;
momencie, funkcja &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; jest wykonywana jednocześnie dwa (lub więcej) razy. W momencie&lt;br /&gt;
wywołania przez funkcję &amp;lt;tt&amp;gt;f&amp;lt;/tt&amp;gt; funkcji potomnej, to wykonanie zostaje zawieszone — stan&lt;br /&gt;
zmiennych i miejsce wykonywania jest zapamiętane. Funkcja zostaje wznowiona, kiedy&lt;br /&gt;
funkcja potomna zakończy działanie.&lt;br /&gt;
&lt;br /&gt;
Z rekurencyjnym wywoływaniem funkcji nie należy przesadzać. Np. obliczenie miliona&lt;br /&gt;
liczb Fibonnaciego z deﬁnicji — w sposób rekurencyjny — raczej nie jest dobrym pomysłem. Obliczanie ich w pętli jest dużo, dużo szybsze. Niemniej, funkcje rekurencyjne są&lt;br /&gt;
zazwyczaj bardzo czytelne i podobne do deﬁnicji matematycznych.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Macierz odwrotna==&lt;br /&gt;
Jeżeli wyznacznik macierzy M jest niezerowy (macierz jest&lt;br /&gt;
niezdegenerowana), można pokusić się o znalezienie macierzy&lt;br /&gt;
odwrotnej.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
A^{-1}=\frac{A^D}{\vert A\vert }&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Macierz &amp;lt;math&amp;gt;A^D&amp;lt;/math&amp;gt; jest macierzą dołączoną do macierzy A.&lt;br /&gt;
&lt;br /&gt;
Macierz dołączona powstaje po transponowaniu macierzy dopełnień algebraicznych.&lt;br /&gt;
&lt;br /&gt;
Element &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; macierzy dopełnień algebraicznych to wyznacznik macierzy&lt;br /&gt;
powstałej z &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; poprzez skreślenie jej &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-tego wiersza i &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-tej kolumny,&lt;br /&gt;
pomnożony przez &amp;lt;math&amp;gt;(-)^{i+j}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid9&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
A^D_{ji} = \vert A_{/i /j} \vert (-)^{i+j}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Napisz program, który:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	wczyta macierz;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	sprawdzi, czy nie jest osobliwa;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	jeżeli nie jest osobliwa, obliczy macierz odwrotną;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	i sprawdzi, czy iloczyn macierzy i macierzy odwrotnej daje macierz &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>