{"id":10003,"date":"2017-05-18T02:11:05","date_gmt":"2017-05-18T06:11:05","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=10003"},"modified":"2017-08-14T10:14:52","modified_gmt":"2017-08-14T14:14:52","slug":"16-pl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/16-pl\/","title":{"rendered":"16: Rekurencja"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: Graeme Kemkes, gdkemkes@alumni.uwaterloo.ca, http:\/\/cscircles.ca<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<p>Widzieli\u015bmy, \u017ce funkcje umo\u017cliwiaj\u0105 organizowanie i ponowne wykorzystanie cz\u0119\u015bci naszego kodu. Widzieli\u015bmy r\u00f3wnie\u017c, \u017ce funkcj\u0119 mo\u017cna zdefiniowa\u0107 za pomoc\u0105 innych funkcji. W tej lekcji dowiadujemy si\u0119, \u017ce funkcja mo\u017ce by\u0107 zdefiniowana przez sam\u0105 siebie! To bardzo u\u017cyteczne podej\u015bcie nosi nazw\u0119 <em>rekurencji<\/em> (rekursji). Legenda g\u0142osi, \u017ce \"aby zrozumie\u0107 rekurencj\u0119, musisz najpierw zrozumie\u0107 rekurencj\u0119\".<\/p>\n<h1>Przyk\u0142ad<\/h1>\n<p>W naszej lekcji na p\u0119tlach u\u017cyli\u015bmy p\u0119tli <code>while<\/code>, aby utworzy\u0107 nast\u0119puj\u0105ce wyj\u015bcie.<\/p>\n<pre>5\r\n4\r\n3\r\n2\r\n1\r\nBlastoff!<\/pre>Oto program, kt\u00f3ry u\u017cywa rekurencji do osi\u0105gni\u0119cia tego samego efektu.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox0'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Liczenie w d\u00f3\u0142 z u\u017cyciem rekurencji<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 214px;'><textarea wrap='off' name='usercode0' id='usercode0'  cols=10 rows=8 readonly='readonly'  style = 'height : 214px;'  class='pyboxCode RO'>\ndef countdown(n):\n  if n == 0:\n    print('Blastoff!')\n  else:\n    print(n)\n    countdown(n - 1)\n\ncountdown(5)<\/textarea><\/div>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(0)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(0,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"fb83afad73e49bd03eb146e614438f7c\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit0\").value = \"Run program\";document.getElementById(\"inputInUse0\").value = \"N\";<\/script>\n<\/p>\n<p>Dodamy dodatkowe wydruki, aby zrozumie\u0107, jak program dzia\u0142a. Ta wersja programu odczytuje r\u00f3wnie\u017c liczb\u0119, od kt\u00f3rej ma sie rozpocz\u0105\u0107 liczenie.<br \/>\n<form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox1'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Odliczanie z u\u017cyciem rekurencji<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 292px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=11 readonly='readonly'  style = 'height : 292px;'  class='pyboxCode RO'>\ndef countdown(n):\n  print('Entering countdown(',n,')')\n  if n == 0:\n    print('Blastoff!')\n  else:\n    print(n)\n    countdown(n - 1)\n  print('Exiting from countdown(',n,')')\n\nlimit = int(input())\ncountdown(limit)<\/textarea><\/div>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput1\">You may enter input for the program in the box below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch1\" value=\"Input Switch\" onclick=\"pbInputSwitch(1,'N')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(1)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(1,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"05187437d86d37a181341f0ec0c7c999\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(1,\"N\");<\/script>\n<\/p>\n<p>Je\u015bli chcesz wypr\u00f3bowa\u0107 inne warto\u015bci wej\u015bciowe, skorzystaj w powy\u017cszym programie z opcji <strong>Wprowad\u017a dane<\/strong>. Wypr\u00f3buj najpierw <code>0<\/code> i zobaczy\u0107, co si\u0119 dzieje, a nast\u0119pnie <code>1<\/code>.<\/p>\n<p>Gdy na wej\u015bciu mamy <code>5<\/code>, program najpierw wywo\u0142uje kopi\u0119 funkcji <code>countdown<\/code> dla <code>n=5<\/code>, kt\u00f3ra drukuje <code>5<\/code> i wywo\u0142uje <code>countdown(4)<\/code>.  To trwa a\u017c do <code>countdown(0)<\/code>, kiedy to drukuje <code>\"Blastoff!\"<\/code> I nie wywo\u0142uje wi\u0119cej <code>countdown<\/code>. Gdy Python dla <code>n=0<\/code> ko\u0144czy wywo\u0142ywanie funkcji <code>countdown<\/code>, Python powraca do funkcji, kt\u00f3ra go wywo\u0142a\u0142a, co oznacza, \u017ce  teraz  <code>n=1<\/code> dla funkcji <code>countdown<\/code>. Potem wr\u00f3cimy do wywo\u0142ania <code>n=2<\/code>, i tak dalej.<\/p>\n<p>Aby staranniej sprawdzi\u0107 nasze rozumowanie, mo\u017cesz tak\u017ce w wizualizerze prze\u015bledzi\u0107 rekurencyjny kod:<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+countdown%28n%29%3A%0A++if+n+%3D%3D+0%3A%0A++++print%28%27Blastoff%21%27%29%0A++else%3A%0A++++print%28n%29%0A++++countdown%28n+-+1%29%0A%0Acountdown%283%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<p>Ten \u201etwist\u201d sprawia, \u017ce rekurencja jest wyj\u0105tkow\u0105 w\u015br\u00f3d funkcji, kt\u00f3re widzieli\u015bmy wcze\u015bniej, wiele wersji tej funkcji dzia\u0142a jednocze\u015bnie. Oznacza to, \u017ce jest wi\u0119cej ni\u017c jedna ramka odpowiadaj\u0105ca tej samej funkcji (w wizualizerze). Jest to do\u015b\u0107 podobne do tego, co <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/10-pl\/#funcfunc\">widzieli\u015bmy w wizualizerze, gdzie jedna funkcja wywo\u0142ywa\u0142a drug\u0105<\/a>, z t\u0105 r\u00f3znic\u0105, \u017ce tu, funkcja wywo\u0142uj\u0105ca jest taka sama jak funkcja wywo\u0142ana. Trzeba jednak pami\u0119ta\u0107, \u017ce na ka\u017cdym kroku s\u0105 u\u017cywane tak naprawd\u0119 tylko zmienne \"bie\u017c\u0105ce\" (najnowsza \/ najni\u017csza ramka) \u2013 ramki, kt\u00f3re nie s\u0105 dolne s\u0105 \"wstrzymane\" a ich zmienne niedost\u0119pne.<\/p>\n<p>Teraz twoja kolej, by napisa\u0107 kod. Zmodyfikuj funkcj\u0119 <code>countdown<\/code> tak, aby liczy\u0142a w g\u00f3r\u0119 zamiast w d\u00f3\u0142.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox2'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Startujemy<\/span><\/div>Napisz funkcj\u0119 rekurencyjn\u0105 <code>countup(n)<\/code>, kt\u00f3ra drukuje \"Blastoff!\" a nast\u0119pnie w kolejnych liniach numery od <code>1<\/code> do <code>n<\/code>. <a class=\"hintlink\"  id=\"hintlink3\">Wskaz\u00f3wka<\/a><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=20   class='pyboxCode RW'>\ndef countdown(n):\n  if n == 0:\n    print('Blastoff!')\n  else:\n    print(n)\n    countdown(n - 1)\n<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput2\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode2' value='def countdown(n):\\n  if n == 0:\\n    print(\\u0027Blastoff!\\u0027)\\n  else:\\n    print(n)\\n    countdown(n - 1)\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch2\" value=\"Input Switch\" onclick=\"pbInputSwitch(2,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect2' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(2,'16.countup')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(2,descape($('#defaultCode2').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(2);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"7f4e7177d9f818cfa7c5bf90d22e5446\"\/>\n<div id='pbresults2' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(2);});pbInputSwitch(2,\"Y\");<\/script>\n<\/p>\n<p>Nast\u0119pnie zmie\u0144my nasz program <code>countdown<\/code> tak, aby liczy\u0142 w krokach co 2. Na wyj\u015bciu powinni\u015bmy otrzyma\u0107 5, 3, 1, Blastoff! Zmienimy argument funkcji z <code>n-1<\/code> na <code>n-2<\/code>. Czy co\u015b jeszcze musimy zmieni\u0107?<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform4\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox4'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Pr\u00f3ba odliczania w krokach co 2<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 214px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=8 readonly='readonly'  style = 'height : 214px;'  class='pyboxCode RO'>\ndef countdownBy2(n):\n  if n == 0:\n    print('Blastoff!')\n  else:\n    print(n)\n    countdownBy2(n - 2)\n\ncountdownBy2(5)<\/textarea><\/div>\n<div id='pbhistory4' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit4' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(4)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(4,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse4\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"4\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"33f97a92cecd10ba94680c59d48b6f7c\"\/>\n<div id='pbresults4' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit4\").value = \"Run program\";document.getElementById(\"inputInUse4\").value = \"N\";<\/script>\n<\/p>\n<p>Mo\u017cna zauwa\u017cy\u0107, \u017ce ten program nie dzia\u0142a zgodnie z naszymi oczekiwaniami. Drukowa\u0142 <code>5, 3, 1<\/code>, tak jak chcemy, ale zamiast tego zatrzymywa\u0142 si\u0119 na <code>-1, -3, -5<\/code> i dalej bieg\u0142 w niesko\u0144czono\u015b\u0107. (A bardziej dok\u0142adniej, zabraknie czasu i pami\u0119ci, poniewa\u017c ka\u017cde wywo\u0142anie rekurencyjne zajmuje troch\u0119 wi\u0119cej pami\u0119ci roboczej, zobacz <a href=\"http:\/\/cscircles.cemc.uwaterloo.ca\/visualize\/#code=def%20countdownBy2(n)%3A%0A%20%20if%20n%20%3D%3D%200%3A%0A%20%20%20%20print('Blastoff!')%0A%20%20else%3A%0A%20%20%20%20print(n)%0A%20%20%20%20countdownBy2(n%20-%202)%0A%0AcountdownBy2(5)\">ten sam przyk\u0142ad w wizualizerze<\/a>).<\/p>\n<p>Podczas projektowania funkcji rekurencyjnej musimy by\u0107 ostro\u017cni, aby jej kolejne wywo\u0142ania nie trwa\u0142y w niesko\u0144czono\u015b\u0107! Zmodyfikuj program <code>countdownBy2<\/code> tak, aby prawid\u0142owo zatrzyma\u0142 si\u0119 na 1 (lub 2, je\u015bli <code>n<\/code> jest parzyste) i wydrukowa\u0142 \"Blastoff!\".<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform5\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox5'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Co dwa<\/span><\/div>Zmodyfikuj ten program rekurencyjny, aby poprawnie liczy\u0107 w krokach co 2.<div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode5' id='usercode5'  cols=10 rows=20   class='pyboxCode RW'>\ndef countdownBy2(n):\n  if n == 0:\n    print('Blastoff!')\n  else:\n    print(n)\n    countdownBy2(n - 2)\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory5' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput5\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode5' value='def countdownBy2(n):\\n  if n == 0:\\n    print(\\u0027Blastoff!\\u0027)\\n  else:\\n    print(n)\\n    countdownBy2(n - 2)\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit5' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch5\" value=\"Input Switch\" onclick=\"pbInputSwitch(5,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(5)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(5,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect5' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(5,'16.countdownby2')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(5,descape($('#defaultCode5').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(5);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse5\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"5\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"b6aac6134b811b6077095d3eb6e854ee\"\/>\n<div id='pbresults5' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(5);});pbInputSwitch(5,\"Y\");<\/script>\n<\/p>\n<h1>Projektowanie Funkcji Rekurencyjnych<\/h1>\n<p><em>Funkcja rekurencyjna<\/em> oznacza funkcj\u0119, kt\u00f3ra wywo\u0142uje sam\u0105 siebie. Ale musi istnie\u0107 kilka przypadk\u00f3w, kiedy funkcja nie wywo\u0142uje samej siebie, bo inaczej, program by dzia\u0142a\u0142 w niesko\u0144czono\u015b\u0107, jak widzieli\u015bmy powy\u017cej. <strong>Przypadek bazowy<\/strong> stanowi cz\u0119\u015b\u0107 funkcji rekurencyjnej, w kt\u00f3rej nie ma wywo\u0142ywania samej siebie. W powy\u017cszym przyk\u0142adzie  dla  <code>n&lt;=0<\/code> mieli\u015bmy przypadek bazowy. Projektowanie funkcji rekurencyjnej wymaga starannego wybrania przypadku bazowego i upewnienia si\u0119, \u017ce ka\u017cda sekwencja wywo\u0142a\u0144 funkcji ostatecznie dotrze do przypadku bazowego.<\/p>\n<p>W nast\u0119pnym \u0107wiczeniu zosta\u0142 ju\u017c zaprogramowany przypadek bazowy, a twoim zadaniem jest zapisa\u0107  reszt\u0119 funkcji rekurencyjnej.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox6'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Suma Cyfr<\/span><\/div><em>Suma cyfr<\/em> liczby <code>n<\/code> jest sum\u0105 jej cyfr. Napisz rekurencyjn\u0105 funkcj\u0119 <code>digitalSum(n)<\/code>, kt\u00f3ra pobiera dodatni\u0105 liczb\u0119 ca\u0142kowit\u0105 <code>n<\/code> i zwraca sum\u0119 jej cyfr. Na przyk\u0142ad, <code>digitalSum(2019)<\/code> powinien zwr\u00f3ci\u0107 12, poniewa\u017c 2 + 0 + 1 + 9 = 12. <a class=\"hintlink\"  id=\"hintlink7\">Wskaz\u00f3wka #1<\/a>\u00a0<a class=\"hintlink\"  id=\"hintlink8\">Wskaz\u00f3wka #2<\/a><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=20   class='pyboxCode RW'>\ndef digitalSum(n):\n  if n &lt; 10:\n return n\n else:\n # recursive case\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput6\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<input type='hidden' id='defaultCode6' value='def digitalSum(n):\\n  if n < 10:\\n return n\\n else:\\n # recursive case\\n'><\/input>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch6\" value=\"Input Switch\" onclick=\"pbInputSwitch(6,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(6)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(6,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect6' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(6,'16.digitalsum')\" >History<\/option>\n<option name='default' data-pbonclick=\"pbSetText(6,descape($('#defaultCode6').val()))\" >Reset code to default<\/option>\n<option name='help' data-pbonclick=\"helpClick(6);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"f287d587a150c83eac45ec7970d46030\"\/>\n<div id='pbresults6' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(6);});pbInputSwitch(6,\"Y\");<\/script>\n<\/p>\n<p>Teraz zapisz funkcj\u0119 rekurencyjn\u0105, kt\u00f3ra wywo\u0142uje <code>digitalSum<\/code> jako podprogram.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform9\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox9'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Cyfra kontrolna<\/span><\/div>Cyfrowy pierwiastek nieujemnej liczby ca\u0142kowitej <code>n<\/code> oblicza si\u0119 w nast\u0119puj\u0105cy spos\u00f3b. Rozpoczynamy od sumy cyfr liczby <code>n<\/code>. Cyfry powsta\u0142ego liczby s\u0105 nast\u0119pnie sumowane, a proces ten trwa do uzyskania jednocyfrowej liczby. Na przyk\u0142ad cyfrowy pierwiastek roku 2019 wynosi 3, poniewa\u017c 2 + 0 + 1 + 9 = 12 i 1 + 2 = 3. Napisz funkcj\u0119 rekurencyjn\u0105 <code>digitalRoot(n)<\/code>, kt\u00f3ra zwraca cyfr\u0119 kontroln\u0105 <code>n<\/code>.<br\/><strong>Za\u0142\u00f3\u017c<\/strong>, \u017ce do twojego programu zosta\u0142a ju\u017c dostarczona robocza definicja programu <code>digitalSum<\/code>.<div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode9' id='usercode9'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory9' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput9\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit9' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch9\" value=\"Input Switch\" onclick=\"pbInputSwitch(9,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(9)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(9,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect9' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(9,'16.digitalroot')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(9);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse9\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"9\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"ff0488e91d7ba32c613949e2ee2c457e\"\/>\n<div id='pbresults9' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(9);});pbInputSwitch(9,\"Y\");<\/script>\n<\/p>\n<p> Ten niezwykle kr\u00f3tki program oblicza <strong>n<\/strong>ajwi\u0119kszy <strong>w<\/strong>sp\u00f3lny <strong>d<\/strong>zielnik dw\u00f3ch liczb. To jeden z najstarszych znanych algorytm\u00f3w zwany <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Algorytm_Euklidesa\">algorytmem Euklidesa <\/a>.<\/p>\n<h1>\u0106wiczenia<\/h1>\n<div class='pybox modeNeutral' id='pybox10'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Short Answer Exercise: <\/span><span class='title'>NWD<\/span><\/div>Co uzyskamy na wyj\u015bciu nast\u0119puj\u0105cego rekurencyjnego programu? <\/p>\n<pre>def gcd(a, b):<br\/> \u00a0if b == 0: return a<br\/> \u00a0return gcd(b, a % b)<br\/>print(gcd(20, 12))<\/pre><label for=\"pyShortAnswer10\">Your answer (enter a number): <\/label><input type=\"text\" onkeypress=\"{if (event.keyCode==13) pbShortCheck(10)}\" id=\"pyShortAnswer10\"><div class=\"pyboxbuttons\"><input type=\"hidden\" name=\"type\" value=\"number\"\/><input type=\"hidden\" name=\"correct\" value=\"4\"\/><input type=\"hidden\" name=\"slug\" value=\"16.shortgcd\"\/><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick = 'pbShortCheck(10)'\/><\/div><div class=\"pbresults\" id=\"pyShortResults10\"><\/div><div class=\"epilogue\">Prawid\u0142owa! Ten niezwykle kr\u00f3tki program oblicza <strong>n<\/strong>ajwi\u0119kszy <strong>w<\/strong>sp\u00f3lny <strong>d<\/strong>zielnik dw\u00f3ch liczb. To jeden z najstarszych znanych algorytm\u00f3w zwany <a href=\"https:\/\/pl.wikipedia.org\/wiki\/Algorytm_Euklidesa\">algorytmem Euklidesa<\/a>.<\/div><\/div>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform11\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox11'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Grad<\/span><\/div><em>Sekwencja gradowa<\/em> zaczynaj\u0105ca si\u0119 od dodatniej liczby ca\u0142kowitej <code>n<\/code> generowana jest poprzez zastosowanie dw\u00f3ch prostych regu\u0142. Je\u015bli <code>n<\/code> jest parzyste, nast\u0119pna liczba  w sekwencji wynosi <code>n\/2<\/code>. Je\u015bli <code>n<\/code> jest nieparzyste, nast\u0119pny numer w sekwencji to <code>3*n+1<\/code>. Powtarzaj\u0105c ten proces wygenerujemy sekwencj\u0119 gradow\u0105. Napisz rekurencyjn\u0105 funkcj\u0119 <code>hailstone(n)<\/code>, kt\u00f3ra drukuje sekwencj\u0119 gradow\u0105 zaczynaj\u0105c\u0105 si\u0119 od <code>n<\/code>. Niech program zatrzyma si\u0119, gdy sekwencja osi\u0105gnie liczb\u0119 <code>1<\/code> (w przeciwnym wypadku, program zap\u0119tli sie i b\u0119dziemy mie\u0107 w k\u00f3\u0142ko: 1, 4, 2, 1, 4, 2, ...)<br\/> Na przyk\u0142ad, gdy <code>n=5<\/code>, Tw\u00f3j program powinien wyprowadzi\u0107 nast\u0119puj\u0105c\u0105 sekwencj\u0119: <\/p>\n<pre>5<br\/>16<br\/>8<br\/>4<br\/>2<br\/>1<\/pre> <div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode11' id='usercode11'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory11' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput11\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit11' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch11\" value=\"Input Switch\" onclick=\"pbInputSwitch(11,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(11)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(11,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect11' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(11,'16.hailstone')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(11);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse11\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"11\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"c6acd69d87bbac7bc3a0bc0c786fc85b\"\/>\n<div id='pbresults11' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(11);});pbInputSwitch(11,\"Y\");<\/script>\n<\/p>\n<p>Matematycy uwa\u017caj\u0105, \u017ce ka\u017cda sekwencja gradowa osi\u0105ga ostatecznie <code>1<\/code>, niezale\u017cnie od tego, od jakiej warto\u015bci <code>n<\/code> zaczniemy. Jednak nikt tego jeszcze nie udowodni\u0142.<\/p>\n<h2>Listy Zagnie\u017cd\u017cone<\/h2>\n<p>Oto interesuj\u0105ce naturalne zastosowanie rekursji. <em>Zagnie\u017cd\u017cona lista<\/em> to miejsce, w kt\u00f3rym mo\u017cna umie\u015bci\u0107 kilka list wewn\u0105trz innych; mo\u017cliwe jest zrobienie tego wielokrotnie. Na przyk\u0142ad, zagnie\u017cd\u017cona lista liczb ca\u0142kowitych to <code>[[1, 2], [9, 10]]<\/code>, jak r\u00f3wnie\u017c <code>[[1], 2]<\/code> i <code>x = [[1], 2, [3, [[4]]]]<\/code>. Ostatni przyk\u0142ad listy zagnie\u017cd\u017conej to lista trzech element\u00f3w: <code>x[0]==[1]<\/code>, aby rozpocz\u0105\u0107, a nast\u0119pnie <code>x[1]==2<\/code>, a nast\u0119pnie <code>x[2]==[3, [[4]]]<\/code>. (Wi\u0119c <code>x<\/code>, postrzegane jako lista o d\u0142ugo\u015bci 3). Zauwa\u017c, \u017ce lista jak <code>[1, 2, 3]<\/code>  r\u00f3wnie\u017c liczy si\u0119 jako zagnie\u017cd\u017cona lista. <strong>Czy mo\u017cemy napisa\u0107 funkcj\u0119, aby znale\u017a\u0107 ca\u0142kowit\u0105 sum\u0119 <em>wszystkich<\/em> zagnie\u017cd\u017conych list liczb ca\u0142kowitych?<\/strong> Na przyk\u0142ad, przy wej\u015bciu <code>[[5], 2, [10, 8, [[7]]]]<\/code> nale\u017ca\u0142oby oczekiwa\u0107 warto\u015bci <code>32<\/code>.<\/p>\n<p>To zadanie jest trudne dla p\u0119tli <code>while <\/code>lub p\u0119tli <code>for<\/code>, poniewa\u017c chcemy, aby funkcja, kt\u00f3ra dzia\u0142a na zagnie\u017cd\u017conych listach z dowolnym kszta\u0142tem\/formatem. Jednak zagnie\u017cd\u017cone listy maj\u0105 naturalnie rekurencyjn\u0105 struktur\u0119: <em>lista zagnie\u017cd\u017cona jest list\u0105, z kt\u00f3rej ka\u017cdy element jest albo (a) liczb\u0105 ca\u0142kowit\u0105, albo (b) list\u0105 zagnie\u017cd\u017con\u0105<\/em>. Gdy obliczymy sum\u0119 ka\u017cdej cz\u0119\u015bci g\u0142\u00f3wnej listy, suma tych warto\u015bci b\u0119dzie sum\u0105 ca\u0142kowit\u0105. Mo\u017cemy to wyrazi\u0107 nast\u0119puj\u0105cym kodem; u\u017cywaj\u0105c <code>isinstance(x, int)<\/code>, kt\u00f3ra daje warto\u015b\u0107 typu boolowskiego informuj\u0105c, czy <code>x<\/code> jest typu ca\u0142kowitego (w przeciwie\u0144stwie do listy).<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform12\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox12'>\n<div class=\"heading\"><span class='type'>Example: <\/span><span class='title'>Sumowanie Listy zagnie\u017cd\u017conej<\/span><\/div>Obliczanie sumy element\u00f3w w zagnie\u017cd\u017conej li\u015bcie z u\u017cyciem funkcji rekurencyjnej. Po naci\u015bni\u0119ciu przycisku <strong>Uruchom program<\/strong> widzimy jego warto\u015b\u0107 w okre\u015blonych testach.<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 214px;'><textarea wrap='off' name='usercode12' id='usercode12'  cols=10 rows=8 readonly='readonly'  style = 'height : 214px;'  class='pyboxCode RO'>\ndef nestedListSum(NL):\n    if isinstance(NL, int):     # case (a): NL is an integer\n        return NL               # base case\n\n    sum = 0                     # case (b): NL is a list of nested lists\n    for i in range(0, len(NL)): # add subsums from each part of the main list\n        sum = sum + nestedListSum(NL[i])\n    return sum                  # all done<\/textarea><\/div>\n<div id='pbhistory12' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput12\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit12' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch12\" value=\"Input Switch\" onclick=\"pbInputSwitch(12,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(12)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(12,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse12\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"12\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"d935628b98234e922d1553e01ac1e36a\"\/>\n<div id='pbresults12' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(12,\"Y\");<\/script>\n<\/p>\n<p>Rekursja s\u0142u\u017cy do podzia\u0142u ka\u017cdej zagnie\u017cd\u017conej listy na mniejsze cz\u0119\u015bci. Na przyk\u0142ad, <code>nestedListSum([1, [3, 4], 5])<\/code> wykonuje \u0142\u0105cznie 6 wywo\u0142a\u0144 rekurencyjnych: pocz\u0105tkowe, potem dla <code>1<\/code>, a nast\u0119pnie dla <code>[3, 4]<\/code>, a nast\u0119pnie dla <code>3<\/code>, potem  dla <code>4<\/code>, (przy czym suma <code>[3, 4]<\/code> jest zwracana jako <code>7<\/code>), a na ko\u0144cu dla <code>5<\/code> (po tym otrzymano \u0142\u0105cznie <code>13<\/code>). Oto ten sam kod w wizualizerze.<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+nestedListSum%28NL%29%3A%0A++if+isinstance%28NL%2C+int%29%3A%0A++++return+NL%0A%0A++sum+%3D+0%0A++for+i+in+range%280%2C+len%28NL%29%29%3A%0A++++sum+%3D+sum+%2B+nestedListSum%28NL%5Bi%5D%29%0A++return+sum%0A%0A%23+some+examples%0AnestedListSum%28129%29%0AnestedListSum%28%5B400%2C+50%2C+6%5D%29%0AnestedListSum%28%5B%5B1%2C+2%5D%2C+%5B3%2C+4%5D%2C+5%5D%29%0AnestedListSum%28%5B%5B1%2C+%5B2%2C+3%5D%2C+4%2C+5%5D%5D%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform13\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox13'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Wyszukiwanie zagnie\u017cd\u017conej listy<\/span><\/div>Zapisuj\u0105c co\u015b podobnego do <code>nestedListSum<\/code>, okre\u015bl funkcj\u0119 rekurencyjn\u0105 <\/p>\n<pre>nestedListContains(NL, target)<\/pre> Kt\u00f3ra dla zagnie\u017cd\u017conej listy <code>NL<\/code> liczb ca\u0142kowitych oraz ca\u0142kowitego <code>target<\/code> wskazuje, czy <code>target<\/code> znajduje si\u0119 w dowolnym miejscu w zagnie\u017cd\u017conej li\u015bcie. Tw\u00f3j kod powinien zwraca\u0107 warto\u015b\u0107 logiczn\u0105 <code>True<\/code>, je\u015bli target znajduje si\u0119 w zagnie\u017cd\u017conej li\u015bcie, a <code>False<\/code>, je\u015bli nie jest w niej zawarty.<br\/>Na przyk\u0142ad, dla <code>nestedListContains([1, [2, [3], 4]], 3)<\/code> powinien zwraca\u0107 warto\u015b\u0107 <code>True<\/code> i dla <code>nestedListContains([1, [2, [3], 4]], 5)<\/code> powinien zwraca\u0107 <code>False<\/code>.<div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode13' id='usercode13'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory13' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput13\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit13' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch13\" value=\"Input Switch\" onclick=\"pbInputSwitch(13,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(13)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(13,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect13' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(13,'17.nestedFind')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(13);\" >Help<\/option>\n<\/select><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse13\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"13\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"f41b84ca95e17c0ba8450b26db85bcc3\"\/>\n<div id='pbresults13' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(13);});pbInputSwitch(13,\"Y\");<\/script>\n<\/p>\n<h2>Linijki<\/h2>\n<p>Rekursja jest r\u00f3wnie\u017c zwi\u0105zana z fraktalami - obrazy zawieraj\u0105ce wiele kopii siebie. Przyk\u0142adem jest banner na g\u00f3rze tej strony. Nast\u0119puj\u0105ce \u0107wiczenie tworzy prosty powtarzaj\u0105cy si\u0119 wz\u00f3r, kt\u00f3ry u\u017cywa rekursji.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform14\" method=\"POST\">\n<div class='pybox modeNeutral scramble' id='pybox14'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Scramble Exercise: <\/span><span class='title'>Fraktalowa linijka<\/span><\/div>Posortuj linie tak, aby utworzy\u0107 program, kt\u00f3ry tworzy rekurencyjny wz\u00f3r. Na przyk\u0142ad, gdy <code>n=3<\/code> program powinien wyprowadzi\u0107 nast\u0119puj\u0105cy wz\u00f3r. <\/p>\n<pre>-<br\/>--<br\/>-<br\/>---<br\/>-<br\/>--<br\/>-<\/pre> <ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble14\">\n <li class=\"pyscramble\">  else:<\/li>\n <li class=\"pyscramble\">  if n == 1:<\/li>\n <li class=\"pyscramble\">   print(&#039;-&#039;)<\/li>\n <li class=\"pyscramble\">   ruler(n - 1)<\/li>\n <li class=\"pyscramble\">def ruler(n):<\/li>\n <li class=\"pyscramble\">   ruler(n - 1)<\/li>\n <li class=\"pyscramble\">   print(n * &#039;-&#039;)<\/li>\n<\/ul>\n<input type='hidden' id='usercode14' name='usercode14'\/>\n<div id='pbhistory14' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit14' value=' '\/><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse14\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"14\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"f2a0d0d5a7f62969dae9c7fcb4c59ab9\"\/>\n<div id='pbresults14' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit14\").value = \"Run program\";document.getElementById(\"inputInUse14\").value = \"N\";<\/script>\nGratulacje! Jeste\u015b gotowy, aby przej\u015b\u0107 do nast\u0119pnej lekcji.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Widzieli\u015bmy, \u017ce funkcje umo\u017cliwiaj\u0105 organizowanie i ponowne wykorzystanie cz\u0119\u015bci naszego kodu. Widzieli\u015bmy r\u00f3wnie\u017c, \u017ce funkcj\u0119 mo\u017cna zdefiniowa\u0107 za pomoc\u0105 innych funkcji. W tej lekcji dowiadujemy si\u0119, \u017ce funkcja mo\u017ce by\u0107 zdefiniowana przez sam\u0105 siebie! To bardzo u\u017cyteczne podej\u015bcie nosi nazw\u0119 &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/16-pl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10003","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10003","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=10003"}],"version-history":[{"count":14,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10003\/revisions"}],"predecessor-version":[{"id":10485,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10003\/revisions\/10485"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=10003"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}