CINXE.COM
Rekurze (programování) – Wikipedie
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available" lang="cs" dir="ltr"> <head> <meta charset="UTF-8"> <title>Rekurze (programování) – Wikipedie</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-disabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )cswikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":[",\t."," \t,"],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"ČSN basic dt","wgMonthNames":["","leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],"wgRequestId":"d9272979-a07b-4d92-a8ac-e7c8f5442f20","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Rekurze_(programování)","wgTitle":"Rekurze (programování)","wgCurRevisionId":23598633,"wgRevisionId":23598633,"wgArticleId":34901,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Údržba:Články bez bibliografie","Monitoring:Autoritní kontrola s 0 identifikátory","Rekurze","Programovací konstrukce"],"wgPageViewLanguage":"cs","wgPageContentLanguage":"cs","wgPageContentModel":"wikitext","wgRelevantPageName":"Rekurze_(programování)","wgRelevantArticleId":34901,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgRedirectedFrom": "Rekurzivní_funkce_(programování)","wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"cs","pageLanguageDir":"ltr","pageVariantFallbacks":"cs"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":true,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":10000,"wgInternalRedirectTargetUrl":"/wiki/Rekurze_(programov%C3%A1n%C3%AD)","wgRelatedArticlesCompat":[],"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q264164","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":true, "wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","ext.math.styles":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["mediawiki.action.view.redirect","ext.pygments.view","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.WikiMiniAtlas","ext.gadget.OSMmapa","ext.gadget.direct-links-to-commons","ext.gadget.ReferenceTooltips","ext.gadget.courses","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap", "ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=cs&modules=ext.math.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=cs&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=cs&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.5"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Rekurze (programování) – Wikipedie"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//cs.m.wikipedia.org/wiki/Rekurze_(programov%C3%A1n%C3%AD)"> <link rel="alternate" type="application/x-wiki" title="Editovat" href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedie (cs)"> <link rel="EditURI" type="application/rsd+xml" href="//cs.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://cs.wikipedia.org/wiki/Rekurze_(programov%C3%A1n%C3%AD)"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.cs"> <link rel="alternate" type="application/atom+xml" title="Atom kanál Wikipedie." href="/w/index.php?title=Speci%C3%A1ln%C3%AD:Posledn%C3%AD_zm%C4%9Bny&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Rekurze_programování rootpage-Rekurze_programování skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Přeskočit na obsah</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Projekt"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Hlavní menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Hlavní menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Hlavní menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">přesunout do postranního panelu</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">skrýt</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigace </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage" class="mw-list-item"><a href="/wiki/Hlavn%C3%AD_strana" title="Navštívit Hlavní stranu [z]" accesskey="z"><span>Hlavní strana</span></a></li><li id="n-help" class="mw-list-item"><a href="/wiki/N%C3%A1pov%C4%9Bda:Obsah" title="Místo, kde najdete pomoc"><span>Nápověda</span></a></li><li id="n-helpdesk" class="mw-list-item"><a href="/wiki/Wikipedie:Pot%C5%99ebuji_pomoc" title="Pokud si nevíte rady, zeptejte se ostatních"><span>Potřebuji pomoc</span></a></li><li id="n-featuredcontent" class="mw-list-item"><a href="/wiki/Wikipedie:Nejlep%C5%A1%C3%AD_%C4%8Dl%C3%A1nky" title="Přehled článků, které jsou považovány za nejlepší na české Wikipedii"><span>Nejlepší články</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:N%C3%A1hodn%C3%A1_str%C3%A1nka" title="Přejít na náhodně vybranou stránku [x]" accesskey="x"><span>Náhodný článek</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:Posledn%C3%AD_zm%C4%9Bny" title="Seznam posledních změn na této wiki [r]" accesskey="r"><span>Poslední změny</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedie:Port%C3%A1l_Wikipedie" title="O projektu, jak můžete pomoci, kde hledat"><span>Komunitní portál</span></a></li><li id="n-villagepump" class="mw-list-item"><a href="/wiki/Wikipedie:Pod_l%C3%ADpou" title="Hlavní diskusní fórum"><span>Pod lípou</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Hlavn%C3%AD_strana" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedie" src="/static/images/mobile/copyright/wikipedia-wordmark-cs.svg" style="width: 7.5em; height: 1.1875em;"> <img class="mw-logo-tagline" alt="Wikipedie: Otevřená encyklopedie" src="/static/images/mobile/copyright/wikipedia-tagline-cs.svg" width="118" height="13" style="width: 7.375em; height: 0.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Speci%C3%A1ln%C3%AD:Hled%C3%A1n%C3%AD" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Prohledat tuto wiki [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Hledání</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Hledat na Wikipedii" aria-label="Hledat na Wikipedii" autocapitalize="sentences" title="Prohledat tuto wiki [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Speciální:Hledání"> </div> <button class="cdx-button cdx-search-input__end-button">Hledat</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Osobní nástroje"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Vzhled"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Změnit vzhled velikosti písma, šířky stránky a barvy" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Vzhled" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Vzhled</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_cs.wikipedia.org&uselang=cs" class=""><span>Podpořte Wikipedii</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Speci%C3%A1ln%C3%AD:Vytvo%C5%99it_%C3%BA%C4%8Det&returnto=Rekurze+%28programov%C3%A1n%C3%AD%29" title="Doporučujeme vytvořit si účet a přihlásit se, ovšem není to povinné" class=""><span>Vytvoření účtu</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Speci%C3%A1ln%C3%AD:P%C5%99ihl%C3%A1sit&returnto=Rekurze+%28programov%C3%A1n%C3%AD%29" title="Doporučujeme vám přihlásit se, ovšem není to povinné. [o]" accesskey="o" class=""><span>Přihlášení</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="Další možnosti" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Osobní nástroje" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Osobní nástroje</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="Uživatelské menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_cs.wikipedia.org&uselang=cs"><span>Podpořte Wikipedii</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:Vytvo%C5%99it_%C3%BA%C4%8Det&returnto=Rekurze+%28programov%C3%A1n%C3%AD%29" title="Doporučujeme vytvořit si účet a přihlásit se, ovšem není to povinné"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Vytvoření účtu</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:P%C5%99ihl%C3%A1sit&returnto=Rekurze+%28programov%C3%A1n%C3%AD%29" title="Doporučujeme vám přihlásit se, ovšem není to povinné. [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Přihlášení</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Stránky pro odhlášené editory <a href="/wiki/N%C3%A1pov%C4%9Bda:%C3%9Avod" aria-label="Více informací o editování"><span>dozvědět se více</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:Moje_p%C5%99%C3%ADsp%C4%9Bvky" title="Seznam editací provedených z této IP adresy [y]" accesskey="y"><span>Příspěvky</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:Moje_diskuse" title="Diskuse o editacích provedených z této IP adresy [n]" accesskey="n"><span>Diskuse</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Projekt"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Obsah" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Obsah</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">přesunout do postranního panelu</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">skrýt</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">(úvod)</div> </a> </li> <li id="toc-Terminologie" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Terminologie"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Terminologie</span> </div> </a> <ul id="toc-Terminologie-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Základní_kroky" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Základní_kroky"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Základní kroky</span> </div> </a> <ul id="toc-Základní_kroky-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Příklady_užití" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Příklady_užití"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Příklady užití</span> </div> </a> <button aria-controls="toc-Příklady_užití-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Přepnout podsekci Příklady užití</span> </button> <ul id="toc-Příklady_užití-sublist" class="vector-toc-list"> <li id="toc-Datové_struktury" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Datové_struktury"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1</span> <span>Datové struktury</span> </div> </a> <ul id="toc-Datové_struktury-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Algoritmy" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Algoritmy"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.2</span> <span>Algoritmy</span> </div> </a> <ul id="toc-Algoritmy-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Ukázky_algoritmů" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Ukázky_algoritmů"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Ukázky algoritmů</span> </div> </a> <button aria-controls="toc-Ukázky_algoritmů-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Přepnout podsekci Ukázky algoritmů</span> </button> <ul id="toc-Ukázky_algoritmů-sublist" class="vector-toc-list"> <li id="toc-Faktoriál" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Faktoriál"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.1</span> <span>Faktoriál</span> </div> </a> <ul id="toc-Faktoriál-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Fibonacciho_posloupnost" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Fibonacciho_posloupnost"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.2</span> <span>Fibonacciho posloupnost</span> </div> </a> <ul id="toc-Fibonacciho_posloupnost-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Quicksort" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Quicksort"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.3</span> <span>Quicksort</span> </div> </a> <ul id="toc-Quicksort-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Robot_Karel" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Robot_Karel"> <div class="vector-toc-text"> <span class="vector-toc-numb">4.4</span> <span>Robot Karel</span> </div> </a> <ul id="toc-Robot_Karel-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Efektivita_rekurzivních_algoritmů" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Efektivita_rekurzivních_algoritmů"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Efektivita rekurzivních algoritmů</span> </div> </a> <button aria-controls="toc-Efektivita_rekurzivních_algoritmů-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Přepnout podsekci Efektivita rekurzivních algoritmů</span> </button> <ul id="toc-Efektivita_rekurzivních_algoritmů-sublist" class="vector-toc-list"> <li id="toc-Tabelace" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Tabelace"> <div class="vector-toc-text"> <span class="vector-toc-numb">5.1</span> <span>Tabelace</span> </div> </a> <ul id="toc-Tabelace-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Koncová_rekurze" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Koncová_rekurze"> <div class="vector-toc-text"> <span class="vector-toc-numb">5.2</span> <span>Koncová rekurze</span> </div> </a> <ul id="toc-Koncová_rekurze-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Obsah" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Přepnout obsah" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Přepnout obsah</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Rekurze (programování)</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Přejděte k článku v jiném jazyce. Je dostupný v 28 jazycích" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-28" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">28 jazyků</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wikipedia.org/wiki/%D8%B9%D9%88%D8%AF%D9%8A%D8%A9_(%D8%B9%D9%84%D9%85_%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8)" title="عودية (علم الحاسوب) – arabština" lang="ar" hreflang="ar" data-title="عودية (علم الحاسوب)" data-language-autonym="العربية" data-language-local-name="arabština" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-bar mw-list-item"><a href="https://bar.wikipedia.org/wiki/Rekursive_Programmierung" title="Rekursive Programmierung – bavorština" lang="bar" hreflang="bar" data-title="Rekursive Programmierung" data-language-autonym="Boarisch" data-language-local-name="bavorština" class="interlanguage-link-target"><span>Boarisch</span></a></li><li class="interlanguage-link interwiki-ca mw-list-item"><a href="https://ca.wikipedia.org/wiki/Algorisme_recursiu" title="Algorisme recursiu – katalánština" lang="ca" hreflang="ca" data-title="Algorisme recursiu" data-language-autonym="Català" data-language-local-name="katalánština" class="interlanguage-link-target"><span>Català</span></a></li><li class="interlanguage-link interwiki-cv mw-list-item"><a href="https://cv.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BB%C4%83_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8" title="Рекурсивлă функци – čuvaština" lang="cv" hreflang="cv" data-title="Рекурсивлă функци" data-language-autonym="Чӑвашла" data-language-local-name="čuvaština" class="interlanguage-link-target"><span>Чӑвашла</span></a></li><li class="interlanguage-link interwiki-de mw-list-item"><a href="https://de.wikipedia.org/wiki/Rekursive_Programmierung" title="Rekursive Programmierung – němčina" lang="de" hreflang="de" data-title="Rekursive Programmierung" data-language-autonym="Deutsch" data-language-local-name="němčina" class="interlanguage-link-target"><span>Deutsch</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wikipedia.org/wiki/Recursion_(computer_science)" title="Recursion (computer science) – angličtina" lang="en" hreflang="en" data-title="Recursion (computer science)" data-language-autonym="English" data-language-local-name="angličtina" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wikipedia.org/wiki/Recursi%C3%B3n_(ciencias_de_computaci%C3%B3n)" title="Recursión (ciencias de computación) – španělština" lang="es" hreflang="es" data-title="Recursión (ciencias de computación)" data-language-autonym="Español" data-language-local-name="španělština" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA_(%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87)" title="بازگشت (علوم رایانه) – perština" lang="fa" hreflang="fa" data-title="بازگشت (علوم رایانه)" data-language-autonym="فارسی" data-language-local-name="perština" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wikipedia.org/wiki/Rekursiivinen_algoritmi" title="Rekursiivinen algoritmi – finština" lang="fi" hreflang="fi" data-title="Rekursiivinen algoritmi" data-language-autonym="Suomi" data-language-local-name="finština" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/Algorithme_r%C3%A9cursif" title="Algorithme récursif – francouzština" lang="fr" hreflang="fr" data-title="Algorithme récursif" data-language-autonym="Français" data-language-local-name="francouzština" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-hi mw-list-item"><a href="https://hi.wikipedia.org/wiki/%E0%A4%AA%E0%A5%81%E0%A4%A8%E0%A4%B0%E0%A4%BE%E0%A4%B5%E0%A5%83%E0%A4%A4%E0%A5%8D%E0%A4%A4%E0%A4%BF_(%E0%A4%95%E0%A4%82%E0%A4%AA%E0%A5%8D%E0%A4%AF%E0%A5%82%E0%A4%9F%E0%A4%B0_%E0%A4%B5%E0%A4%BF%E0%A4%9C%E0%A5%8D%E0%A4%9E%E0%A4%BE%E0%A4%A8)" title="पुनरावृत्ति (कंप्यूटर विज्ञान) – hindština" lang="hi" hreflang="hi" data-title="पुनरावृत्ति (कंप्यूटर विज्ञान)" data-language-autonym="हिन्दी" data-language-local-name="hindština" class="interlanguage-link-target"><span>हिन्दी</span></a></li><li class="interlanguage-link interwiki-hy mw-list-item"><a href="https://hy.wikipedia.org/wiki/%D5%8C%D5%A5%D5%AF%D5%B8%D6%82%D6%80%D5%BD%D5%AB%D5%A1_(%D5%AB%D5%B6%D6%86%D5%B8%D6%80%D5%B4%D5%A1%D5%BF%D5%AB%D5%AF%D5%A1)" title="Ռեկուրսիա (ինֆորմատիկա) – arménština" lang="hy" hreflang="hy" data-title="Ռեկուրսիա (ինֆորմատիկա)" data-language-autonym="Հայերեն" data-language-local-name="arménština" class="interlanguage-link-target"><span>Հայերեն</span></a></li><li class="interlanguage-link interwiki-it mw-list-item"><a href="https://it.wikipedia.org/wiki/Algoritmo_ricorsivo" title="Algoritmo ricorsivo – italština" lang="it" hreflang="it" data-title="Algoritmo ricorsivo" data-language-autonym="Italiano" data-language-local-name="italština" class="interlanguage-link-target"><span>Italiano</span></a></li><li class="interlanguage-link interwiki-ja badge-Q70893996 mw-list-item" title=""><a href="https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0" title="再帰的アルゴリズム – japonština" lang="ja" hreflang="ja" data-title="再帰的アルゴリズム" data-language-autonym="日本語" data-language-local-name="japonština" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-kk mw-list-item"><a href="https://kk.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D1%82%D1%96_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F" title="Рекурсивті функция – kazaština" lang="kk" hreflang="kk" data-title="Рекурсивті функция" data-language-autonym="Қазақша" data-language-local-name="kazaština" class="interlanguage-link-target"><span>Қазақша</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wikipedia.org/wiki/%EC%9E%AC%EA%B7%80_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)" title="재귀 (컴퓨터 과학) – korejština" lang="ko" hreflang="ko" data-title="재귀 (컴퓨터 과학)" data-language-autonym="한국어" data-language-local-name="korejština" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-nl mw-list-item"><a href="https://nl.wikipedia.org/wiki/Recursie_(informatica)" title="Recursie (informatica) – nizozemština" lang="nl" hreflang="nl" data-title="Recursie (informatica)" data-language-autonym="Nederlands" data-language-local-name="nizozemština" class="interlanguage-link-target"><span>Nederlands</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)" title="Recursividade (ciência da computação) – portugalština" lang="pt" hreflang="pt" data-title="Recursividade (ciência da computação)" data-language-autonym="Português" data-language-local-name="portugalština" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F" title="Рекурсивная функция – ruština" lang="ru" hreflang="ru" data-title="Рекурсивная функция" data-language-autonym="Русский" data-language-local-name="ruština" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-simple mw-list-item"><a href="https://simple.wikipedia.org/wiki/Recursive_algorithm" title="Recursive algorithm – Simple English" lang="en-simple" hreflang="en-simple" data-title="Recursive algorithm" data-language-autonym="Simple English" data-language-local-name="Simple English" class="interlanguage-link-target"><span>Simple English</span></a></li><li class="interlanguage-link interwiki-sk mw-list-item"><a href="https://sk.wikipedia.org/wiki/Rekurzia_(informatika)" title="Rekurzia (informatika) – slovenština" lang="sk" hreflang="sk" data-title="Rekurzia (informatika)" data-language-autonym="Slovenčina" data-language-local-name="slovenština" class="interlanguage-link-target"><span>Slovenčina</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D0%B7%D0%B8%D1%98%D0%B0_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%98%D1%83%D1%82%D0%B5%D1%80%D1%81%D0%BA%D0%B5_%D0%BD%D0%B0%D1%83%D0%BA%D0%B5)" title="Рекурзија (компјутерске науке) – srbština" lang="sr" hreflang="sr" data-title="Рекурзија (компјутерске науке)" data-language-autonym="Српски / srpski" data-language-local-name="srbština" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-sv mw-list-item"><a href="https://sv.wikipedia.org/wiki/Rekursiv_algoritm" title="Rekursiv algoritm – švédština" lang="sv" hreflang="sv" data-title="Rekursiv algoritm" data-language-autonym="Svenska" data-language-local-name="švédština" class="interlanguage-link-target"><span>Svenska</span></a></li><li class="interlanguage-link interwiki-ta mw-list-item"><a href="https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AF%81%E0%AE%B4%E0%AE%B2%E0%AF%8D" title="சுழல் – tamilština" lang="ta" hreflang="ta" data-title="சுழல்" data-language-autonym="தமிழ்" data-language-local-name="tamilština" class="interlanguage-link-target"><span>தமிழ்</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%81%D1%96%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F)" title="Рекурсія (програмування) – ukrajinština" lang="uk" hreflang="uk" data-title="Рекурсія (програмування)" data-language-autonym="Українська" data-language-local-name="ukrajinština" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wikipedia.org/wiki/%C4%90%E1%BB%87_quy_(tin_h%E1%BB%8Dc)" title="Đệ quy (tin học) – vietnamština" lang="vi" hreflang="vi" data-title="Đệ quy (tin học)" data-language-autonym="Tiếng Việt" data-language-local-name="vietnamština" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)" title="递归 (计算机科学) – čínština" lang="zh" hreflang="zh" data-title="递归 (计算机科学)" data-language-autonym="中文" data-language-local-name="čínština" class="interlanguage-link-target"><span>中文</span></a></li><li class="interlanguage-link interwiki-zh-yue mw-list-item"><a href="https://zh-yue.wikipedia.org/wiki/%E9%81%9E%E6%AD%B8_(%E9%9B%BB%E8%85%A6%E7%A7%91%E5%AD%B8)" title="遞歸 (電腦科學) – kantonština" lang="yue" hreflang="yue" data-title="遞歸 (電腦科學)" data-language-autonym="粵語" data-language-local-name="kantonština" class="interlanguage-link-target"><span>粵語</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q264164#sitelinks-wikipedia" title="Editovat mezijazykové odkazy" class="wbc-editpage">Upravit odkazy</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Jmenné prostory"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Rekurze_(programov%C3%A1n%C3%AD)" title="Zobrazit obsahovou stránku [c]" accesskey="c"><span>Článek</span></a></li><li id="ca-talk" class="new vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Diskuse:Rekurze_(programov%C3%A1n%C3%AD)&action=edit&redlink=1" rel="discussion" class="new" title="Diskuse ke stránce (stránka neexistuje) [t]" accesskey="t"><span>Diskuse</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Změnit variantu jazyka" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">čeština</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Zobrazení"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Rekurze_(programov%C3%A1n%C3%AD)"><span>Číst</span></a></li><li id="ca-ve-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit" title="Editovat tuto stránku [v]" accesskey="v"><span>Editovat</span></a></li><li id="ca-edit" class="collapsible vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit" title="Editovat zdrojový kód této stránky [e]" accesskey="e"><span>Editovat zdroj</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=history" title="Starší verze této stránky. [h]" accesskey="h"><span>Zobrazit historii</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Nástroje ke stránce"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Nástroje" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Nástroje</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Nástroje</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">přesunout do postranního panelu</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">skrýt</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="Další možnosti" > <div class="vector-menu-heading"> Akce </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Rekurze_(programov%C3%A1n%C3%AD)"><span>Číst</span></a></li><li id="ca-more-ve-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit" title="Editovat tuto stránku [v]" accesskey="v"><span>Editovat</span></a></li><li id="ca-more-edit" class="collapsible vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit" title="Editovat zdrojový kód této stránky [e]" accesskey="e"><span>Editovat zdroj</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=history"><span>Zobrazit historii</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> Obecné </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:Co_odkazuje_na/Rekurze_(programov%C3%A1n%C3%AD)" title="Seznam všech wikistránek, které sem odkazují [j]" accesskey="j"><span>Odkazuje sem</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:Souvisej%C3%ADc%C3%AD_zm%C4%9Bny/Rekurze_(programov%C3%A1n%C3%AD)" rel="nofollow" title="Nedávné změny stránek, na které je odkazováno [k]" accesskey="k"><span>Související změny</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=cs" title="Nahrát obrázky či jiná multimédia [u]" accesskey="u"><span>Načíst soubor</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Speci%C3%A1ln%C3%AD:Speci%C3%A1ln%C3%AD_str%C3%A1nky" title="Seznam všech speciálních stránek [q]" accesskey="q"><span>Speciální stránky</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&oldid=23598633" title="Trvalý odkaz na současnou verzi této stránky"><span>Trvalý odkaz</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=info" title="Více informací o této stránce"><span>Informace o stránce</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:Citovat&page=Rekurze_%28programov%C3%A1n%C3%AD%29&id=23598633&wpFormIdentifier=titleform" title="Informace o tom, jak citovat tuto stránku"><span>Citovat stránku</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:UrlShortener&url=https%3A%2F%2Fcs.wikipedia.org%2Fwiki%2FRekurze_%28programov%25C3%25A1n%25C3%25AD%29"><span>Získat zkrácené URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:QrCode&url=https%3A%2F%2Fcs.wikipedia.org%2Fwiki%2FRekurze_%28programov%25C3%25A1n%25C3%25AD%29"><span>Stáhnout QR kód</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Tisk/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:Kniha&bookcmd=book_creator&referer=Rekurze+%28programov%C3%A1n%C3%AD%29"><span>Vytvořit knihu</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Speci%C3%A1ln%C3%AD:DownloadAsPdf&page=Rekurze_%28programov%C3%A1n%C3%AD%29&action=show-download-screen"><span>Stáhnout jako PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&printable=yes" title="Tato stránka v podobě vhodné k tisku [p]" accesskey="p"><span>Verze k tisku</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> Na jiných projektech </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q264164" title="Odkaz na propojenou položku datového úložiště [g]" accesskey="g"><span>Položka Wikidat</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Nástroje ke stránce"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Vzhled"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Vzhled</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">přesunout do postranního panelu</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">skrýt</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">Z Wikipedie, otevřené encyklopedie</div> </div> <div id="contentSub"><div id="mw-content-subtitle"><span class="mw-redirectedfrom">(přesměrováno z <a href="/w/index.php?title=Rekurzivn%C3%AD_funkce_(programov%C3%A1n%C3%AD)&redirect=no" class="mw-redirect" title="Rekurzivní funkce (programování)">Rekurzivní funkce (programování)</a>)</span></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="cs" dir="ltr"><div class="noprint ambox labelced labelced-page labelced-page-type-content ambox-content plainlinks"> <div class="labelced_message"><div class="labelced_image ambox-image mbox-image"><span typeof="mw:File"><span><img alt="ikona" src="//upload.wikimedia.org/wikipedia/commons/thumb/3/33/Nuvola_apps_bookcase.png/48px-Nuvola_apps_bookcase.png" decoding="async" width="48" height="48" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/3/33/Nuvola_apps_bookcase.png/72px-Nuvola_apps_bookcase.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/3/33/Nuvola_apps_bookcase.png/96px-Nuvola_apps_bookcase.png 2x" data-file-width="128" data-file-height="128" /></span></span></div> <div class="labelced_message_inner"> <div class="labelced_message_headline ambox-text">Tento článek potřebuje doplnit či upravit literaturu.</div> <div class="labelced_message_text hide-when-compact ambox-text">Můžete Wikipedii pomoci tím, že na konec článku přidáte (resp. upravíte) kapitolu <b><a href="/wiki/N%C3%A1pov%C4%9Bda:Literatura" title="Nápověda:Literatura">Literatura</a></b> a uvedete vhodné knihy, ze kterých lze o daném tématu čerpat více informací. Knihy by měly být uváděny standardní formou <a href="/wiki/N%C3%A1pov%C4%9Bda:Citace" title="Nápověda:Citace">citace</a>.</div> </div> </div> </div> <p><b>Rekurze</b> je <a href="/wiki/Programov%C3%A1n%C3%AD" title="Programování">programovací</a> technika, při níž je určitá <a href="/wiki/Podprogram" title="Podprogram">procedura nebo funkce</a> znovu volána dříve, než je dokončeno její předchozí volání. </p><p>Použití rekurze může u některých úloh vést ke stručnému a matematicky elegantnímu řešení. Nevede ale nutně k řešení optimálnímu. Použití rekurze vede obvykle k jinému rozložení využití prostředků přidělených programu <a href="/wiki/Opera%C4%8Dn%C3%AD_syst%C3%A9m" title="Operační systém">operačním systémem</a>, případně k jejich rychlejšímu vyčerpání, proto se při optimalizaci programu většinou snažíme rekurzi omezit nebo odstranit. </p><p>Některé (zejména starší) <a href="/wiki/Programovac%C3%AD_jazyk" title="Programovací jazyk">programovací jazyky</a> a některé <a href="/wiki/P%C5%99eklada%C4%8D" title="Překladač">překladače</a> rekurzi neumožňují; jiné vyžadují, aby programátor explicitně uvedl, že je daná procedura nebo funkce rekurzivní. </p><p>Jednou ze základních součástí většiny programovacích jazyků jsou <a href="/wiki/Cyklus_(programov%C3%A1n%C3%AD)" class="mw-redirect" title="Cyklus (programování)">cykly</a>. Existují však i jazyky, které místo cyklů využívají právě rekurzi. Jedná se například o <a href="/wiki/Lisp" title="Lisp">Lisp</a> či <a href="/wiki/Prolog_(programovac%C3%AD_jazyk)" title="Prolog (programovací jazyk)">Prolog</a>. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Terminologie">Terminologie</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=1" title="Editace sekce: Terminologie" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=1" title="Editovat zdrojový kód sekce Terminologie"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Rekurzivní chování může být různé v závislosti na tom, kolik podprogramů se jí účastní. Rozlišujeme dva základní typy dělení. </p><p>1. Volání může probíhat přímo nebo nepřímo: </p> <ul><li><i>Přímá rekurze</i> nastává, když podprogram volá přímo sám sebe.</li> <li><i>Nepřímá rekurze</i> je situace, kdy vzájemné volání podprogramů vytvoří „kruh“. Např. ve funkci <i>A</i> se volá funkce <i>B</i> a ve funkci <i>B</i> se volá opět funkce <i>A</i>.</li></ul> <p>2. Podprogram může být volán jednou nebo vícekrát: </p> <ul><li><i>Lineární rekurze</i> nastává, pokud podprogram při vykonávání svého úkolu volá sama sebe pouze jednou. Vytváří se takto lineární struktura postupně volaných podprogramů.</li> <li><i>Stromová rekurze</i> nastává, pokud se funkce nebo procedura v rámci jednoho vykonání svého úkolu vyvolá vícekrát. Strukturu volání je možné znázornit jako <a href="/wiki/Strom_(graf)#zakořeněný_strom" title="Strom (graf)">zakořeněný strom</a>. Pro dvě volání v jednom průchodu vzniká <a href="/wiki/Bin%C3%A1rn%C3%AD_strom" title="Binární strom">binární strom</a>, pro tři ternární strom, atd. (Počet rekurzivních volání nemusí být konstantní, např. při rekurzivním procházení grafu voláme zpracování na všechny sousedy vrcholu, a těch je obecně různý počet.)</li></ul> <div class="mw-heading mw-heading2"><h2 id="Základní_kroky"><span id="Z.C3.A1kladn.C3.AD_kroky"></span>Základní kroky</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=2" title="Editace sekce: Základní kroky" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=2" title="Editovat zdrojový kód sekce Základní kroky"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Program, který používá rekurzivní volání, obvykle provádí tyto kroky: </p> <ul><li>Kontrola, zda vstupní parametry odpovídají stanoveným podmínkám.</li> <li>Inicializace, tj. nastavení hodnot, se nimiž se výpočet zahájí.</li> <li>Vlastní rekurze: <ul><li>Rozdělení problému na dílčí podproblémy.</li> <li>Zavolání funkcí, které řeší daný podproblém (tady nastává přímé nebo nepřímé volání sebe sama).</li> <li>Sestavení výsledku.</li></ul></li> <li>Vrácení výsledku.</li></ul> <div class="mw-heading mw-heading2"><h2 id="Příklady_užití"><span id="P.C5.99.C3.ADklady_u.C5.BEit.C3.AD"></span>Příklady užití</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=3" title="Editace sekce: Příklady užití" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=3" title="Editovat zdrojový kód sekce Příklady užití"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Datové_struktury"><span id="Datov.C3.A9_struktury"></span>Datové struktury</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=4" title="Editace sekce: Datové struktury" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=4" title="Editovat zdrojový kód sekce Datové struktury"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Při deklaraci datových struktur rekurze znamená, že určitá struktura (objekt) obsahuje odkaz na strukturu stejného typu. </p> <dl><dt>Rekurzivní definice binárního stromu (jazyk C)</dt></dl> <div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// definice typu uzel</span> <span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">data</span><span class="p">;</span> <span class="w"> </span><span class="n">uzel</span><span class="w"> </span><span class="o">*</span><span class="n">levyPotomek</span><span class="p">;</span><span class="w"> </span><span class="c1">// potomek je také typu uzel</span> <span class="w"> </span><span class="n">uzel</span><span class="w"> </span><span class="o">*</span><span class="n">pravyPotomek</span><span class="p">;</span> <span class="p">}</span><span class="w"> </span><span class="n">uzel</span><span class="p">;</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Algoritmy">Algoritmy</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=5" title="Editace sekce: Algoritmy" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=5" title="Editovat zdrojový kód sekce Algoritmy"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>V oblasti algoritmů můžeme pomocí rekurze nalézt řešení obecných úloh rozkladem na dílčí úlohy stejného typu. Často jej nalezneme v algoritmech typu „<a href="/wiki/Rozd%C4%9Bl_a_panuj_(algoritmus)" title="Rozděl a panuj (algoritmus)">rozděl a panuj</a>“. Tato programovací technika se hodí pro takové úlohy, u nichž je rozdělení na menší úlohy stejného charakteru snadné a přirozené. Typickým příkladem přirozeně rekurzivního algoritmu je průchod stromem (s obecným počtem potomků): </p> <dl><dt>Průchod stromem (jazyk C)</dt></dl> <div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">ProjdiStrom</span><span class="p">(</span><span class="n">uzel</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kt">unsigned</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span> <span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">count</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">ProjdiStrom</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span> <span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="n">ZpracujUzel</span><span class="p">(</span><span class="n">x</span><span class="p">);</span><span class="w"> </span><span class="c1">// zde jsou prováděny operace s daty uloženými v daném uzlu</span> <span class="p">}</span> </pre></div> <p>Pro zpracování celého stromu zavoláme proceduru a jako parametr jí předáme kořen stromu. Procedura pak rekurzivně volá sebe sama pro potomky aktuálního uzlu (čili pro podstromy daného stromu), dokud nedosáhne k uzlům, které nemají žádné potomky (v grafové terminologii <i>listy</i>). </p> <div class="mw-heading mw-heading2"><h2 id="Ukázky_algoritmů"><span id="Uk.C3.A1zky_algoritm.C5.AF"></span>Ukázky algoritmů</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=6" title="Editace sekce: Ukázky algoritmů" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=6" title="Editovat zdrojový kód sekce Ukázky algoritmů"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Faktoriál"><span id="Faktori.C3.A1l"></span>Faktoriál</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=7" title="Editace sekce: Faktoriál" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=7" title="Editovat zdrojový kód sekce Faktoriál"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Oblíbeným výukovým příkladem je funkce <a href="/wiki/Faktori%C3%A1l" title="Faktoriál">faktoriál</a> <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N!}"> <semantics> <mrow class="MJX-TeXAtom-ORD"> <mstyle displaystyle="true" scriptlevel="0"> <mi>N</mi> <mo>!</mo> </mstyle> </mrow> <annotation encoding="application/x-tex">{\displaystyle N!}</annotation> </semantics> </math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/300942b4cb2d0fc0c9c0a6dd1b68d61549bfb3cb" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.71ex; height:2.176ex;" alt="{\displaystyle N!}"></span>, která je pro celá nezáporná čísla definována vztahy <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N!=N\cdot (N-1)!}"> <semantics> <mrow class="MJX-TeXAtom-ORD"> <mstyle displaystyle="true" scriptlevel="0"> <mi>N</mi> <mo>!</mo> <mo>=</mo> <mi>N</mi> <mo>⋅<!-- ⋅ --></mo> <mo stretchy="false">(</mo> <mi>N</mi> <mo>−<!-- − --></mo> <mn>1</mn> <mo stretchy="false">)</mo> <mo>!</mo> </mstyle> </mrow> <annotation encoding="application/x-tex">{\displaystyle N!=N\cdot (N-1)!}</annotation> </semantics> </math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/369715e8aeda5a93fef706663a0cbdb30f10bb4e" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:18.074ex; height:2.843ex;" alt="{\displaystyle N!=N\cdot (N-1)!}"></span> a <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \quad 0!=1}"> <semantics> <mrow class="MJX-TeXAtom-ORD"> <mstyle displaystyle="true" scriptlevel="0"> <mspace width="1em" /> <mn>0</mn> <mo>!</mo> <mo>=</mo> <mn>1</mn> </mstyle> </mrow> <annotation encoding="application/x-tex">{\displaystyle \quad 0!=1}</annotation> </semantics> </math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/151a8478cc1d4c68cfeb89d3944c615efe15fa60" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:8.393ex; height:2.176ex;" alt="{\displaystyle \quad 0!=1}"></span>. </p><p>Následující funkce Faktorial používá při výpočtu rekurzivního <a href="/wiki/Algoritmus" title="Algoritmus">algoritmu</a>, který přesně odpovídá této definici. </p> <dl><dt>Výpočet faktoriálu pomocí rekurze</dt> <dd></dd></dl> <pre>function Faktorial(integer N) if N < 0 then return "Chybný argument" end if if N = 0 then return 1 end if return Faktorial(N - 1) * N end function </pre> <p>Použití rekurzivních funkcí může výrazně zjednodušit řešení úlohy. Má však různá úskalí, které je potřeba při implementaci rekurze vzít v úvahu (viz <a href="#Efektivita_rekurzivních_algoritmů">Efektivita rekurzivních algoritmů</a> níže). Při výpočtu faktoriálu je snadné se rekurzi vyhnout a nahradit ji jinou metodou – v tomto případě <a href="/wiki/Iterace" title="Iterace">iterací</a>. </p> <dl><dt>Výpočet faktoriálu pomocí iterace</dt> <dd></dd></dl> <pre>function FaktorialIter(integer N) integer nfact if N < 0 then return "Chybný argument" end if nfact = 1 for i = 1 to N do nfact = nfact * i end for return nfact end function </pre> <div class="mw-heading mw-heading3"><h3 id="Fibonacciho_posloupnost">Fibonacciho posloupnost</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=8" title="Editace sekce: Fibonacciho posloupnost" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=8" title="Editovat zdrojový kód sekce Fibonacciho posloupnost"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Fibonacciho_posloupnost" title="Fibonacciho posloupnost">Fibonacciho posloupnost</a> je vhodnou ukázkou, jak lze řešit určitou úlohu různými a různě efektivními způsoby. Použití rekurze je zde sice přímočaré, ale není vhodné, protože neúměrně zvýší složitost úlohy. </p><p>První člen Fibonacciho posloupnosti <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(0)=0}"> <semantics> <mrow class="MJX-TeXAtom-ORD"> <mstyle displaystyle="true" scriptlevel="0"> <mi>f</mi> <mo stretchy="false">(</mo> <mn>0</mn> <mo stretchy="false">)</mo> <mo>=</mo> <mn>0</mn> </mstyle> </mrow> <annotation encoding="application/x-tex">{\displaystyle f(0)=0}</annotation> </semantics> </math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/8d308c32c9894b88115262081194321ae7d9bbf3" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:8.511ex; height:2.843ex;" alt="{\displaystyle f(0)=0}"></span>, druhý člen <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(1)=1}"> <semantics> <mrow class="MJX-TeXAtom-ORD"> <mstyle displaystyle="true" scriptlevel="0"> <mi>f</mi> <mo stretchy="false">(</mo> <mn>1</mn> <mo stretchy="false">)</mo> <mo>=</mo> <mn>1</mn> </mstyle> </mrow> <annotation encoding="application/x-tex">{\displaystyle f(1)=1}</annotation> </semantics> </math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/c23ec03a1dad7631fc47878cb66b800a538dff1c" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:8.511ex; height:2.843ex;" alt="{\displaystyle f(1)=1}"></span> a každý další člen je součtem dvou předchozích. Prvních několik členů tedy vypadá následovně: </p> <dl><dd>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …</dd></dl> <p><i>n</i>-tý člen posloupnosti lze nalézt pomocí rekurzivního předpisu <span class="mwe-math-element"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f(n)=f(n-1)+f(n-2)}"> <semantics> <mrow class="MJX-TeXAtom-ORD"> <mstyle displaystyle="true" scriptlevel="0"> <mi>f</mi> <mo stretchy="false">(</mo> <mi>n</mi> <mo stretchy="false">)</mo> <mo>=</mo> <mi>f</mi> <mo stretchy="false">(</mo> <mi>n</mi> <mo>−<!-- − --></mo> <mn>1</mn> <mo stretchy="false">)</mo> <mo>+</mo> <mi>f</mi> <mo stretchy="false">(</mo> <mi>n</mi> <mo>−<!-- − --></mo> <mn>2</mn> <mo stretchy="false">)</mo> </mstyle> </mrow> <annotation encoding="application/x-tex">{\displaystyle f(n)=f(n-1)+f(n-2)}</annotation> </semantics> </math></span><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/5292c0129a4ebd0f560bf6b1b3647dc5ac5eda6d" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:27.392ex; height:2.843ex;" alt="{\displaystyle f(n)=f(n-1)+f(n-2)}"></span> a z něho odvozeného rekurzivního algoritmu. Funkce volá sama sebe pro výpočet dvou předchozích členů posloupnosti a ty následně sečte. Struktura volání podprogramů tvoří strom. Tento způsob výpočtu má exponenciální časovou složitost. Je to dáno tím, že při výpočtu vyšších čísel počítáme opakovaně prvky, které jsme již počítali. </p> <dl><dt>Výpočet prvku Fibonacciho posloupnosti pomocí rekurze</dt> <dd></dd></dl> <pre>fibonacci(N): pokud N < 2, potom: pokud N < 1, potom: výsledek = 0; jinak: výsledek = 1; jinak: výsledek = fibonacci(N-1) + fibonacci(N-2); </pre> <p><i>n</i>-tý člen Fibonacciho posloupnosti lze spočítat i bez rekurze. Stačí prvky posloupnosti počítat od začátku a ukládat je například do <a href="/wiki/Pole_(datov%C3%A1_struktura)" title="Pole (datová struktura)">pole</a>. První dva členy jsou dány (0, 1) a každým součtem předchozích dvou prvků lze získat další prvek. Na podobné chování (z hlediska paměti ale ne příliš optimalizované) vede použití <a href="#Tabelace">tabelace</a> (viz níže) na rekurzivní algoritmus. </p> <dl><dt>Výpočet prvku Fibonacciho posloupnosti pomocí iterace</dt> <dd></dd></dl> <pre>fibonacci(N): P je pole[0 .. MaxN]; P[0] = 0; P[1] = 1; pro i od 2 do N proveď: P[i] = P[i-1] + P[i-2]; výsledek = P[N]; konec </pre> <p>Tento algoritmus lze optimalizovat dále. Stačí ukládat si jen poslední dvě hodnoty a paměťovou složitost tak lze zredukovat na konstantní. </p> <div class="mw-heading mw-heading3"><h3 id="Quicksort">Quicksort</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=9" title="Editace sekce: Quicksort" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=9" title="Editovat zdrojový kód sekce Quicksort"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Ukázkou vhodného užití rekurze je algoritmus <a href="/wiki/Quicksort" class="mw-redirect" title="Quicksort">Quicksort</a>. Jedná se o rychlý a poměrně jednoduchý <a href="/wiki/%C5%98adic%C3%AD_algoritmus" title="Řadicí algoritmus">řadicí algoritmus</a>. Princip spočívá v rozdělení posloupnosti čísel do dvou oblastí na základě srovnání s hodnotou nějakého vhodně zvoleného členu posloupnosti – nazýváme ji <i>pivot</i>. Do první oblasti umístíme čísla menší než pivot a do druhé čísla větší. (Ideálním pivotem je hodnota blízká <a href="/wiki/Medi%C3%A1n" title="Medián">mediánu</a> posloupnosti, proto se pivot se často volí z prostřed posloupnosti – lze předpokládat, že posloupnost může být již uspořádaná nebo částečně uspořádaná.) Pak se obě části rekurzivně řadí stejným postupem, dokud nebudou mít jednotlivé úseky pouze jeden člen. Jsou-li takto seřazeny obě části, je seřazená i celá posloupnost. </p> <dl><dt>QuickSort (jazyk C++)</dt></dl> <div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">QuickSort</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">Array</span><span class="p">[],</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Left</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Right</span><span class="p">)</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">tmp</span><span class="p">,</span><span class="w"> </span><span class="n">pivot</span><span class="p">,</span><span class="w"> </span><span class="n">l</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">;</span> <span class="w"> </span><span class="n">pivot</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Array</span><span class="p">[(</span><span class="n">Left</span><span class="o">+</span><span class="n">Right</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">];</span> <span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Left</span><span class="p">;</span> <span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Right</span><span class="p">;</span> <span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// cyklus s podmínkou na konci</span> <span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">Array</span><span class="p">[</span><span class="n">l</span><span class="p">]</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">pivot</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">l</span><span class="o">++</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1">// l++, r-- zvětšení/zmenšení o jedničku</span> <span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">Array</span><span class="p">[</span><span class="n">r</span><span class="p">]</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">pivot</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">r</span><span class="o">--</span><span class="p">;</span><span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">l</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// prohození čísel</span> <span class="w"> </span><span class="n">tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Array</span><span class="p">[</span><span class="n">l</span><span class="p">];</span> <span class="w"> </span><span class="n">Array</span><span class="p">[</span><span class="n">l</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Array</span><span class="p">[</span><span class="n">r</span><span class="p">];</span> <span class="w"> </span><span class="n">Array</span><span class="p">[</span><span class="n">r</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tmp</span><span class="p">;</span> <span class="w"> </span><span class="n">l</span><span class="o">++</span><span class="p">;</span><span class="w"> </span><span class="n">r</span><span class="o">--</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">l</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// "překřížení" l a r</span> <span class="w"> </span><span class="n">l</span><span class="o">++</span><span class="p">;</span><span class="w"> </span><span class="n">r</span><span class="o">--</span><span class="p">;</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">l</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="n">r</span><span class="p">);</span><span class="w"> </span><span class="c1">// podmínka "do" cyklu</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">Left</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">QuickSort</span><span class="p">(</span><span class="n">Array</span><span class="p">,</span><span class="w"> </span><span class="n">Left</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">l</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">Right</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">QuickSort</span><span class="p">(</span><span class="n">Array</span><span class="p">,</span><span class="w"> </span><span class="n">l</span><span class="p">,</span><span class="w"> </span><span class="n">Right</span><span class="p">);</span><span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="Robot_Karel">Robot Karel</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=10" title="Editace sekce: Robot Karel" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=10" title="Editovat zdrojový kód sekce Robot Karel"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Jiným příkladem rekurzivního algoritmu může být úkol pro robota <a href="/wiki/Karel_(programovac%C3%AD_jazyk)" title="Karel (programovací jazyk)">Karla</a>, aby ušel polovinu vzdálenosti od místa, kde stojí, k protilehlé zdi, přestože neví, jak je zeď daleko. V takovém případě stačí vytvořit proceduru, během které v případě, že stojí již před zdí, tak se otočí čelem vzad, jinak udělá dva kroky, zavolá stejnou proceduru a udělá krok. (Pro jednoduchost předpokládáme, že před Karlem je sudý počet volných políček.) </p> <pre>DoPulky znamena kdyz bude zed vlevo vlevo jinak krok krok DoPulky krok konec konec </pre> <div class="mw-heading mw-heading2"><h2 id="Efektivita_rekurzivních_algoritmů"><span id="Efektivita_rekurzivn.C3.ADch_algoritm.C5.AF"></span>Efektivita rekurzivních algoritmů</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=11" title="Editace sekce: Efektivita rekurzivních algoritmů" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=11" title="Editovat zdrojový kód sekce Efektivita rekurzivních algoritmů"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Použití rekurze v algoritmech s sebou přináší výhody i nevýhody. Výhodou je jednoduchost a přehlednost algoritmu. Naopak nevýhodou je, že každé volání rekurzivní funkce zvyšuje hloubku zanoření funkce a vyžaduje dodatečné místo v paměti a čas procesoru. Při každém vyvolání podprogramu se provádí několik kroků: uložení lokálních proměnných do zásobníku, předání parametrů a návratové adresy a skok do podprogramu. Po ukončení rekurze se díky uloženým návratovým adresám řízení vrátí zpět a obnoví se uložený kontext. </p><p>Standardní rekurze ukládá obvykle všechny lokální proměnné (<a href="/wiki/Statick%C3%A1_anal%C3%BDza_k%C3%B3du" title="Statická analýza kódu">statická analýza kódu</a> se snaží o optimalizaci, ale nemusí být dokonalá), kdežto ruční implementace (např. iterace se zásobníkem) může být efektivnější – dobrý programátor ji dokáže napsat tak, aby se ukládaly pouze nezbytné informace. </p><p>Stejně jako u většiny algoritmů platí, že stručný zápis je vhodný pro úvodní seznámení s algoritmem či jeho hlavní myšlenkou. Následně se algoritmus vhodně implementuje, což může znamenat i opuštění rekurzivního popisu, návrh nových datových struktur (zásobníku spravovaného programátorem či pole pro dynamické programování) a jejich vhodnou obsluhu. </p> <div class="mw-heading mw-heading3"><h3 id="Tabelace">Tabelace</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=12" title="Editace sekce: Tabelace" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=12" title="Editovat zdrojový kód sekce Tabelace"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/w/index.php?title=Tabelace&action=edit&redlink=1" class="new" title="Tabelace (stránka neexistuje)">Tabelace</a> je způsob odstraňování neefektivity pocházející z opakovaných volání se stejnými argumenty. Spočítané výsledky se ukládají (např. do <a href="/wiki/Pole_(datov%C3%A1_struktura)" title="Pole (datová struktura)">pole</a>) a místo opakovaného volání se přečte výsledek z tabulky, kam se uložil po prvním výpočtu s danými argumenty. Položky tabulky potřebují kromě uložené hodnoty 1 bit navíc, který určuje, zda jsou data platná, tj. už spočítána. Tabelace je typická pro <a href="/wiki/Dynamick%C3%A9_programov%C3%A1n%C3%AD" title="Dynamické programování">dynamické programování</a>. Tento přístup představuje <a href="/wiki/Trade-off" title="Trade-off">trade-off</a> (substituci) mezi časovou a paměťovou náročností. </p><p>Pole může být vícerozměrné, kdy počet rozměrů odpovídá počtu argumentů. Anebo jednorozměrné, použité jako <a href="/wiki/Ha%C5%A1ovac%C3%AD_tabulka" title="Hašovací tabulka">hašovací tabulka</a>. První reprezentace je výhodná, pokud jsou počítané hodnoty husté, druhá je spíše pro řídké. </p><p>Výhodou tabelace je, že programátor nemusí měnit rekurzivní algoritmus. Nevýhodou je potřeba paměti pro tabulku. </p> <div class="mw-heading mw-heading3"><h3 id="Koncová_rekurze"><span id="Koncov.C3.A1_rekurze"></span>Koncová rekurze</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&veaction=edit&section=13" title="Editace sekce: Koncová rekurze" class="mw-editsection-visualeditor"><span>editovat</span></a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&action=edit&section=13" title="Editovat zdrojový kód sekce Koncová rekurze"><span>editovat zdroj</span></a><span class="mw-editsection-bracket">]</span></span></div> <dl><dd><div class="uvodni-upozorneni hatnote"> Podrobnější informace naleznete v článku <a href="/wiki/Koncov%C3%A1_rekurze" title="Koncová rekurze">Koncová rekurze</a>.</div></dd></dl> <p><a href="/wiki/Koncov%C3%A1_rekurze" title="Koncová rekurze">Koncová rekurze</a> je optimalizační technika, která snižuje spotřebu paměti pro zásobník návratových adres. Pokud je posledním příkazem funkce rekurzivní zavolání sebe sama (nebo jiné funkce), pak překladač zajistí, že toto poslední volání neukládá data na zásobník, ale přepíše rámec volající procedury. Optimalizaci lze provádět pro přímou i nepřímou rekurzi. Ne všechny překladače ale tuto techniku podporují. V některých případech je nutné algoritmus přepracovat, aby se optimalizace koncové rekurze dala použít. <style data-mw-deduplicate="TemplateStyles:r23078045">.mw-parser-output .navbox2{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox2 .navbox2{margin-top:0}.mw-parser-output .navbox2+.navbox2{margin-top:-1px}.mw-parser-output .navbox2-inner,.mw-parser-output .navbox2-subgroup{width:100%}.mw-parser-output .navbox2-group,.mw-parser-output .navbox2-title,.mw-parser-output .navbox2-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output th.navbox2-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox2,.mw-parser-output .navbox2-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox2-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output tr+tr>.navbox2-abovebelow,.mw-parser-output tr+tr>.navbox2-group,.mw-parser-output tr+tr>.navbox2-image,.mw-parser-output tr+tr>.navbox2-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox2 th,.mw-parser-output .navbox2-title{background-color:#e0e0e0}.mw-parser-output .navbox2-abovebelow,.mw-parser-output th.navbox2-group,.mw-parser-output .navbox2-subgroup .navbox2-title{background-color:#e7e7e7}.mw-parser-output .navbox2-subgroup .navbox2-title{font-size:88%}.mw-parser-output .navbox2-subgroup .navbox2-group,.mw-parser-output .navbox2-subgroup .navbox2-abovebelow{background-color:#f0f0f0}.mw-parser-output .navbox2-even{background-color:#f7f7f7}.mw-parser-output .navbox2-odd{background-color:transparent}.mw-parser-output .navbox2 .hlist td dl,.mw-parser-output .navbox2 .hlist td ol,.mw-parser-output .navbox2 .hlist td ul,.mw-parser-output .navbox2 td.hlist dl,.mw-parser-output .navbox2 td.hlist ol,.mw-parser-output .navbox2 td.hlist ul{padding:0.125em 0}</style> </p> <!-- NewPP limit report Parsed by mw‐api‐int.codfw.main‐fdccb95f‐drcxq Cached time: 20241127222024 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] CPU time usage: 0.117 seconds Real time usage: 0.431 seconds Preprocessor visited node count: 368/1000000 Post‐expand include size: 3033/2097152 bytes Template argument size: 929/2097152 bytes Highest expansion depth: 10/100 Expensive parser function count: 4/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 12847/5000000 bytes Lua time usage: 0.016/10.000 seconds Lua memory usage: 705518/52428800 bytes Number of Wikibase entities loaded: 1/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 161.343 1 -total 51.09% 82.430 1 Šablona:Autoritní_data 35.82% 57.799 1 Šablona:Bibliografie 15.86% 25.593 1 Šablona:Cedule 12.91% 20.823 1 Šablona:Cedule/komentář 11.19% 18.059 1 Šablona:Podrobně 11.02% 17.783 4 Šablona:Kategorie 7.80% 12.586 1 Šablona:Seznam 1.72% 2.776 2 Šablona:Povinný_stacktrace 1.72% 2.774 1 Šablona:Seznam/link --> <!-- Saved in parser cache with key cswiki:pcache:idhash:34901-0!canonical and timestamp 20241127222024 and revision id 23598633. Rendering was triggered because: api-parse --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1&useformat=desktop" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Citováno z „<a dir="ltr" href="https://cs.wikipedia.org/w/index.php?title=Rekurze_(programování)&oldid=23598633">https://cs.wikipedia.org/w/index.php?title=Rekurze_(programování)&oldid=23598633</a>“</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/N%C3%A1pov%C4%9Bda:Kategorie" title="Nápověda:Kategorie">Kategorie</a>: <ul><li><a href="/wiki/Kategorie:Rekurze" title="Kategorie:Rekurze">Rekurze</a></li><li><a href="/wiki/Kategorie:Programovac%C3%AD_konstrukce" title="Kategorie:Programovací konstrukce">Programovací konstrukce</a></li></ul></div><div id="mw-hidden-catlinks" class="mw-hidden-catlinks mw-hidden-cats-hidden">Skryté kategorie: <ul><li><a href="/wiki/Kategorie:%C3%9Adr%C5%BEba:%C4%8Cl%C3%A1nky_bez_bibliografie" title="Kategorie:Údržba:Články bez bibliografie">Údržba:Články bez bibliografie</a></li><li><a href="/wiki/Kategorie:Monitoring:Autoritn%C3%AD_kontrola_s_0_identifik%C3%A1tory" title="Kategorie:Monitoring:Autoritní kontrola s 0 identifikátory">Monitoring:Autoritní kontrola s 0 identifikátory</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> Stránka byla naposledy editována 27. 1. 2024 v 11:36.</li> <li id="footer-info-copyright">Text je dostupný pod <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.cs">licencí Creative Commons Uveďte původ – Zachovejte licenci</a>, případně za dalších podmínek. Podrobnosti naleznete na stránce <a class="external text" href="https://foundation.wikimedia.org/wiki/Policy:Terms_of_Use/cs">Podmínky užití</a>.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Ochrana osobních údajů</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedie">O Wikipedii</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedie:Vylou%C4%8Den%C3%AD_odpov%C4%9Bdnosti">Vyloučení odpovědnosti</a></li> <li id="footer-places-contact"><a href="//cs.wikipedia.org/wiki/Wikipedie:Kontakt">Kontaktujte Wikipedii</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Kodex chování</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Vývojáři</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/cs.wikipedia.org">Statistiky</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Prohlášení o cookies</a></li> <li id="footer-places-mobileview"><a href="//cs.m.wikipedia.org/w/index.php?title=Rekurze_(programov%C3%A1n%C3%AD)&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobilní verze</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-78f4c97c5d-jdhn4","wgBackendResponseTime":156,"wgPageParseReport":{"limitreport":{"cputime":"0.117","walltime":"0.431","ppvisitednodes":{"value":368,"limit":1000000},"postexpandincludesize":{"value":3033,"limit":2097152},"templateargumentsize":{"value":929,"limit":2097152},"expansiondepth":{"value":10,"limit":100},"expensivefunctioncount":{"value":4,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":12847,"limit":5000000},"entityaccesscount":{"value":1,"limit":400},"timingprofile":["100.00% 161.343 1 -total"," 51.09% 82.430 1 Šablona:Autoritní_data"," 35.82% 57.799 1 Šablona:Bibliografie"," 15.86% 25.593 1 Šablona:Cedule"," 12.91% 20.823 1 Šablona:Cedule/komentář"," 11.19% 18.059 1 Šablona:Podrobně"," 11.02% 17.783 4 Šablona:Kategorie"," 7.80% 12.586 1 Šablona:Seznam"," 1.72% 2.776 2 Šablona:Povinný_stacktrace"," 1.72% 2.774 1 Šablona:Seznam/link"]},"scribunto":{"limitreport-timeusage":{"value":"0.016","limit":"10.000"},"limitreport-memusage":{"value":705518,"limit":52428800}},"cachereport":{"origin":"mw-api-int.codfw.main-fdccb95f-drcxq","timestamp":"20241127222024","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Rekurze (programov\u00e1n\u00ed)","url":"https:\/\/cs.wikipedia.org\/wiki\/Rekurze_(programov%C3%A1n%C3%AD)","sameAs":"http:\/\/www.wikidata.org\/entity\/Q264164","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q264164","author":{"@type":"Organization","name":"P\u0159isp\u011bvatel\u00e9 projekt\u016f Wikimedia"},"publisher":{"@type":"Organization","name":"nadace Wikimedia","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2005-09-07T10:58:46Z","dateModified":"2024-01-27T10:36:40Z"}</script> </body> </html>