{"id":"informatyka-2019-maj-matura-rozszerzona/zad/2.1","paper_id":"informatyka-2019-maj-matura-rozszerzona","number":"2.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2019,"month":"maj","level":"rozszerzona","text":"Zadanie 2.1. (0-2)\na) Uzupełnij miejsca oznaczone kropkami w drzewie wywołań funkcji pisz otrzymanym\nw wyniku wywołania pisz(\"\",2,2).\nb) W kwadratowych polach, przy węzłach drzewa, podaj odpowiednią kolejność wywołań\nfunkcji pisz, tzn. przy pierwszym wywołaniu - 1, przy kolejnym - 2 itd.\npisz(\"\",2,2)\npisz(\"0\",2,2)\npisz(\"1\",2,2)\npisz(\"00\",2,2)\npisz(\"01\",2,2)\n1\nMIN_1R","answer":null,"answer_text":"Zadanie 2.1. (0-2)\nWymagania ogólne\nWymagania szczegółowe\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […]\nz zastosowaniem podejścia algorytmicznego.\n5. Rozwiązywanie problemów\ni podejmowanie decyzji […], stosowanie\npodejścia algorytmicznego.\nZdający:\n5) posługuje się podstawowymi technikami\nalgorytmicznymi;\n9) stosuje rekurencję w prostych sytuacjach\nproblemowych;\n11) opisuje podstawowe algorytmy\ni stosuje:[…]\nd) algorytmy na tekstach […]\n16) opisuje własności algorytmów na\npodstawie ich analizy;\n17) ocenia zgodność algorytmu ze\nspecyfikacją problemu;\n18) oblicza liczbę operacji wykonywanych\nprzez algorytm.\nSchemat punktowania\n2 p. - za poprawną odpowiedź, w tym:\n1 p. - poprawne uzupełnienie drzewka wywołań funkcji pisz,\n1 p. - prawidłową kolejność wywołań.\n0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.\nPoprawna odpowiedź","solution":"## Poprawna odpowiedź\n\n**a) Brakujące węzły:** `pisz(\"10\", 2, 2)` i `pisz(\"11\", 2, 2)`.\n\n**b) Kolejność wywołań:**\n\n| Numer | Wywołanie |\n| 1 | pisz(\"\", 2, 2) |\n| 2 | pisz(\"0\", 2, 2) |\n| 3 | pisz(\"00\", 2, 2) |\n| 4 | pisz(\"01\", 2, 2) |\n| 5 | pisz(\"1\", 2, 2) |\n| 6 | pisz(\"10\", 2, 2) |\n| 7 | pisz(\"11\", 2, 2) |\n\n**Drzewo z numeracją (pre-order DFS):**\n\n[1] pisz(\"\", 2, 2)\n[2] pisz(\"0\", 2, 2) [5] pisz(\"1\", 2, 2)\n[3] pisz(\"00\") [4] pisz(\"01\") [6] pisz(\"10\") [7] pisz(\"11\")\n\n## Sposób 1 - symulacja rekurencji krok po kroku\n\nFunkcja `pisz(s, n, k)`:\n- jeśli `dł(s) = n` → wypisz s (warunek bazowy);\n- inaczej → dla i = 0 k-1 wywołaj `pisz(s + napis(i), n, k)`.\n\nDla `pisz(\"\", 2, 2)` (n=2, k=2):\n\n**[1] pisz(\"\", 2, 2):** dł(\"\")=0 ≠ 2 → pętla `i=0,1`:\n- i=0: wywołaj **[2] pisz(\"0\", 2, 2)**:\n- dł(\"0\")=1 ≠ 2 → pętla i=0,1:\n- i=0: **[3] pisz(\"00\", 2, 2)** → dł(\"00\")=2 → **wypisz \"00\"**.\n- i=1: **[4] pisz(\"01\", 2, 2)** → dł(\"01\")=2 → **wypisz \"01\"**.\n- i=1: wywołaj **[5] pisz(\"1\", 2, 2)**:\n- dł(\"1\")=1 ≠ 2 → pętla i=0,1:\n- i=0: **[6] pisz(\"10\", 2, 2)** → dł(\"10\")=2 → **wypisz \"10\"**.\n- i=1: **[7] pisz(\"11\", 2, 2)** → dł(\"11\")=2 → **wypisz \"11\"**.\n\n**Wypisany ciąg: 00, 01, 10, 11** (wszystkie binarne liczby 2-bitowe!).\n\n## Sposób 2 - interpretacja jako pre-order DFS po drzewie pełnym\n\nFunkcja `pisz` buduje **pełne drzewo k-arne** głębokości n. Liście to wszystkie napisy długości n nad alfabetem {0, 1, , k-1}, a wewnętrzne węzły to wszystkie krótsze prefiksy.\n\nKolejność wywołań to **pre-order traversal** (NLR): najpierw węzeł aktualny (wywołanie funkcji), potem rekurencyjnie poddrzewa od i=0 do i=k-1 (lewe do prawego).\n\n**Implementacja Python (do weryfikacji):**\n```python\nlicznik = [0]\nkolejnosc = []\n\ndef pisz(s, n, k):\nlicznik[0] += 1\nkolejnosc.append((licznik[0], s))\nif len(s) == n:\nprint(s)\nreturn\nfor i in range(k):\npisz(s + str(i), n, k)\n\npisz(\"\", 2, 2)\nfor nr, s in kolejnosc:\nprint(nr, repr(s))\n# 1 '' 2 '0' 3 '00' 4 '01' 5 '1' 6 '10' 7 '11'\n\n## Reference informatyczny - pre-order DFS\n\n> Reference - Drzewo wywołań rekurencji:\n> - Każde wywołanie funkcji = węzeł drzewa. Wywołania zagnieżdżone = krawędzie.\n> - Kolejność wywołań = **pre-order DFS** (NLR): najpierw węzeł, potem rekurencyjnie poddrzewa.\n> - Liczba liści = liczba kombinacji ciągu długości n nad alfabetem k-elementowym = **k^n**.\n> - Łączna liczba węzłów (wywołań) = 1 + k + k² + + k^n = **(k^(n+1) - 1) / (k - 1)**.\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.1, max 2 pkt):\n> - **2 pkt** - poprawna odpowiedź, w tym:\n> - 1 pkt - poprawne uzupełnienie drzewa (pisz(\"10\") i pisz(\"11\"))\n> - 1 pkt - prawidłowa kolejność wywołań (1-7)\n> - **0 pkt** - błędna lub brak\n\n## Typowe pułapki\n\n- **Numerowanie tylko liści** zamiast wszystkich węzłów - kolejność powinna obejmować WSZYSTKIE wywołania.\n- **Pomylenie pre-order z post-order** - w post-order: 3, 4, 2, 6, 7, 5, 1 (najpierw liście, na końcu korzeń).\n- **Mylenie kolejności i=0,1** - najpierw idzie i=0 (lewa), potem i=1 (prawa).\n- **Brakujące dopisanie cyfry**: pisz(\"\") + i=1 → pisz(\"1\"), NIE pisz(\"01\").\n\n## Złożoność obliczeniowa\n\n- Liczba wywołań dla `pisz(\"\", n, k)`: **(k^(n+1) - 1) / (k - 1)**.\n- Dla pisz(\"\", 2, 2): (2³ - 1)/(2 - 1) = 7 ✓.\n- Czas pojedynczego wywołania (bez rekurencji): O(dł(s)) na konkatenację - łącznie O(n · k^n).\n- Pamięć stosu rekurencji: O(n) (głębokość drzewa).","image":"img/informatyka-2019-maj-matura-rozszerzona/zad-2.1.webp","solution_image":null,"topics":null,"page_from":4,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2019 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 2.1. (0-2)<br>a) Uzupełnij miejsca oznaczone kropkami w drzewie wywołań funkcji pisz otrzymanym<br>w wyniku wywołania pisz(&quot;&quot;,2,2).<br>b) W kwadratowych polach, przy węzłach drzewa, podaj odpowiednią kolejność wywołań<br>funkcji pisz, tzn. przy pierwszym wywołaniu - 1, przy kolejnym - 2 itd.<br>pisz(&quot;&quot;,2,2)<br>pisz(&quot;0&quot;,2,2)<br>pisz(&quot;1&quot;,2,2)<br>pisz(&quot;00&quot;,2,2)<br>pisz(&quot;01&quot;,2,2)<br>1<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 2.1. (0-2)<br>Wymagania ogólne<br>Wymagania szczegółowe<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji […]<br>z zastosowaniem podejścia algorytmicznego.</p>\n<ol><li>Rozwiązywanie problemów</li></ol>\n<p>i podejmowanie decyzji […], stosowanie<br>podejścia algorytmicznego.<br>Zdający:</p>\n<ol><li>posługuje się podstawowymi technikami</li></ol>\n<p>algorytmicznymi;</p>\n<ol><li>stosuje rekurencję w prostych sytuacjach</li></ol>\n<p>problemowych;</p>\n<ol><li>opisuje podstawowe algorytmy</li></ol>\n<p>i stosuje:[…]<br>d) algorytmy na tekstach […]</p>\n<ol><li>opisuje własności algorytmów na</li></ol>\n<p>podstawie ich analizy;</p>\n<ol><li>ocenia zgodność algorytmu ze</li></ol>\n<p>specyfikacją problemu;</p>\n<ol><li>oblicza liczbę operacji wykonywanych</li></ol>\n<p>przez algorytm.<br>Schemat punktowania<br>2 p. - za poprawną odpowiedź, w tym:<br>1 p. - poprawne uzupełnienie drzewka wywołań funkcji pisz,<br>1 p. - prawidłową kolejność wywołań.<br>0 p. - za podanie odpowiedzi błędnej albo brak odpowiedzi.<br>Poprawna odpowiedź</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>a) Brakujące węzły:</strong> <code>pisz(&quot;10&quot;, 2, 2)</code> i <code>pisz(&quot;11&quot;, 2, 2)</code>.</p>\n<p><strong>b) Kolejność wywołań:</strong></p>\n<p>| Numer | Wywołanie |<br>| 1 | pisz(&quot;&quot;, 2, 2) |<br>| 2 | pisz(&quot;0&quot;, 2, 2) |<br>| 3 | pisz(&quot;00&quot;, 2, 2) |<br>| 4 | pisz(&quot;01&quot;, 2, 2) |<br>| 5 | pisz(&quot;1&quot;, 2, 2) |<br>| 6 | pisz(&quot;10&quot;, 2, 2) |<br>| 7 | pisz(&quot;11&quot;, 2, 2) |</p>\n<p><strong>Drzewo z numeracją (pre-order DFS):</strong></p>\n<p>[1] pisz(&quot;&quot;, 2, 2)<br>[2] pisz(&quot;0&quot;, 2, 2) [5] pisz(&quot;1&quot;, 2, 2)<br>[3] pisz(&quot;00&quot;) [4] pisz(&quot;01&quot;) [6] pisz(&quot;10&quot;) [7] pisz(&quot;11&quot;)</p>\n<h4>Sposób 1 - symulacja rekurencji krok po kroku</h4>\n<p>Funkcja <code>pisz(s, n, k)</code>:</p>\n<ul><li>jeśli <code>dł(s) = n</code> → wypisz s (warunek bazowy);</li><li>inaczej → dla i = 0 k-1 wywołaj <code>pisz(s + napis(i), n, k)</code>.</li></ul>\n<p>Dla <code>pisz(&quot;&quot;, 2, 2)</code> (n=2, k=2):</p>\n<p><strong>[1] pisz(&quot;&quot;, 2, 2):</strong> dł(&quot;&quot;)=0 ≠ 2 → pętla <code>i=0,1</code>:</p>\n<ul><li>i=0: wywołaj <strong>[2] pisz(&quot;0&quot;, 2, 2)</strong>:</li><li>dł(&quot;0&quot;)=1 ≠ 2 → pętla i=0,1:</li><li>i=0: <strong>[3] pisz(&quot;00&quot;, 2, 2)</strong> → dł(&quot;00&quot;)=2 → <strong>wypisz &quot;00&quot;</strong>.</li><li>i=1: <strong>[4] pisz(&quot;01&quot;, 2, 2)</strong> → dł(&quot;01&quot;)=2 → <strong>wypisz &quot;01&quot;</strong>.</li><li>i=1: wywołaj <strong>[5] pisz(&quot;1&quot;, 2, 2)</strong>:</li><li>dł(&quot;1&quot;)=1 ≠ 2 → pętla i=0,1:</li><li>i=0: <strong>[6] pisz(&quot;10&quot;, 2, 2)</strong> → dł(&quot;10&quot;)=2 → <strong>wypisz &quot;10&quot;</strong>.</li><li>i=1: <strong>[7] pisz(&quot;11&quot;, 2, 2)</strong> → dł(&quot;11&quot;)=2 → <strong>wypisz &quot;11&quot;</strong>.</li></ul>\n<p><strong>Wypisany ciąg: 00, 01, 10, 11</strong> (wszystkie binarne liczby 2-bitowe!).</p>\n<h4>Sposób 2 - interpretacja jako pre-order DFS po drzewie pełnym</h4>\n<p>Funkcja <code>pisz</code> buduje <strong>pełne drzewo k-arne</strong> głębokości n. Liście to wszystkie napisy długości n nad alfabetem {0, 1, , k-1}, a wewnętrzne węzły to wszystkie krótsze prefiksy.</p>\n<p>Kolejność wywołań to <strong>pre-order traversal</strong> (NLR): najpierw węzeł aktualny (wywołanie funkcji), potem rekurencyjnie poddrzewa od i=0 do i=k-1 (lewe do prawego).</p>\n<p><strong>Implementacja Python (do weryfikacji):</strong><br>```python<br>licznik = [0]<br>kolejnosc = []</p>\n<p>def pisz(s, n, k):<br>licznik[0] += 1<br>kolejnosc.append((licznik[0], s))<br>if len(s) == n:<br>print(s)<br>return<br>for i in range(k):<br>pisz(s + str(i), n, k)</p>\n<p>pisz(&quot;&quot;, 2, 2)<br>for nr, s in kolejnosc:<br>print(nr, repr(s))</p>\n<h3>1 &#x27;&#x27; 2 &#x27;0&#x27; 3 &#x27;00&#x27; 4 &#x27;01&#x27; 5 &#x27;1&#x27; 6 &#x27;10&#x27; 7 &#x27;11&#x27;</h3>\n<h4>Reference informatyczny - pre-order DFS</h4>\n<blockquote>Reference - Drzewo wywołań rekurencji:<br>- Każde wywołanie funkcji = węzeł drzewa. Wywołania zagnieżdżone = krawędzie.<br>- Kolejność wywołań = <strong>pre-order DFS</strong> (NLR): najpierw węzeł, potem rekurencyjnie poddrzewa.<br>- Liczba liści = liczba kombinacji ciągu długości n nad alfabetem k-elementowym = <strong>k^n</strong>.<br>- Łączna liczba węzłów (wywołań) = 1 + k + k² + + k^n = <strong>(k^(n+1) - 1) / (k - 1)</strong>.</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 2.1, max 2 pkt):<br>- <strong>2 pkt</strong> - poprawna odpowiedź, w tym:<br>- 1 pkt - poprawne uzupełnienie drzewa (pisz(&quot;10&quot;) i pisz(&quot;11&quot;))<br>- 1 pkt - prawidłowa kolejność wywołań (1-7)<br>- <strong>0 pkt</strong> - błędna lub brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Numerowanie tylko liści</strong> zamiast wszystkich węzłów - kolejność powinna obejmować WSZYSTKIE wywołania.</li><li><strong>Pomylenie pre-order z post-order</strong> - w post-order: 3, 4, 2, 6, 7, 5, 1 (najpierw liście, na końcu korzeń).</li><li><strong>Mylenie kolejności i=0,1</strong> - najpierw idzie i=0 (lewa), potem i=1 (prawa).</li><li><strong>Brakujące dopisanie cyfry</strong>: pisz(&quot;&quot;) + i=1 → pisz(&quot;1&quot;), NIE pisz(&quot;01&quot;).</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Liczba wywołań dla <code>pisz(&quot;&quot;, n, k)</code>: <strong>(k^(n+1) - 1) / (k - 1)</strong>.</li><li>Dla pisz(&quot;&quot;, 2, 2): (2³ - 1)/(2 - 1) = 7 ✓.</li><li>Czas pojedynczego wywołania (bez rekurencji): O(dł(s)) na konkatenację - łącznie O(n · k^n).</li><li>Pamięć stosu rekurencji: O(n) (głębokość drzewa).</li></ul>"}]}