Python中函數的遞歸調用

????????函數調用自己的編程方式被稱為函數的遞歸調用遞歸通常能夠將一個大型的復雜問題的遞歸條件,一層一層的回溯到終止條件,然后再根據終止條件的運算結果,一層一層的遞進運算到滿足全部的遞歸條件。它能夠使用少量程序描述出解題過程中的重復運算部分,減少程序的代碼量。要使用遞歸的方式進行編程,需要在編程的時候規劃好終止條件,寫好遞歸條件,用回溯的邏輯方法解決問題。

下面我們來舉個例子:

1.使用遞歸函數,求斐波那契數列的前10個數

def fib(n):if n==1 or n==0:return 1else:return fib(n-2)+fib(n-1)for n in range(10):print(fib(n),end='\t')

說明:斐波那契數列是一個常用的數學數列,第n個斐波那契數fib(n)由以下兩個條件決定:

1 n = 0n = 1時:

? fib(0) = 1fib(1) = 1

?(2) n > 1時:

??fib(n) = fib(n-1) + fib(n-2)

【代碼分析】

(1) 第1行,在定義一個名為fib的函數,傳遞給這個函數的參數為n。

(2) 由題設,斐波那契數列中,n == 0或n == 1時,fib(0) 與fib(1) 都等于 1,我們把這個叫做終止條件。

(3) 第2、3行,在程序中實現終止條件。終止條件,一般都會給定一個或多個數值,或實現某些特定操作。

(4) 由題設,斐波那契數列中,從第三個數開始,第n個斐波那契數的數值,是由公式fib(n) = fib(n-1) + fib(n-2)計算得到,我們稱這個是遞歸條件。

(5) 第5行,在程序中實現了遞歸條件。

(6) 第7、8行,使用循環,傳遞0到9,共10個數字進fib函數

(7) 當n == 0 和n == 1時,fib的返回值都為1。

(8) 當n == 2時,第3行不會運行,會運行第5行。第5行中,會調用fib(0)和fib(1),會執行:fib(2) = fib(0) + fib(1)。

(9) 當n == 3時,第2行、第3行不會運行,會運行第5行。第5行中,會調用fib(1)和fib(2),會執行:fib(3) = fib(1) + fib(2)。但是fib(2)此時會重復(7)中所描述的動作,所以此時fib(3) = fib(1) + fib(2) = fib(1) + (fib(0) + fib(1))。

(10) 當n == 4時,第2行、第3行不會運行,會運行第5行。第5行中,會調用fib(2)和fib(3),會執行:fib(4) = fib(2) + fib(3)。但是fib(2)此時會重復(7)中所描述的動作,fib(3)會重復(8)中所描述過程,所以此時fib(4) = fib(2) + fib(3) = (fib(0) + fib(1)) + (fib(1) + fib(2)) =? (fib(0) + fib(1)) + (fib(1) + (fib(0) + fib(1)))。

????????每次n無法滿足終止條件時,fib(n)都會回溯到fib(n-1)和fib(n-2),只有當n滿足了終止條件(n == 0和n == 1)時,fib(n)才會返回一個確定值,然后根據這個確定的值開始計算。簡單的說,遞歸函數,會執行上述過程……、(10)、(9)、(8),直到(7)。

注意:

????????當遞歸層數超過了系統允許的最大遞歸深度。默認情況下,當遞歸調用到1000層,Python解釋器將終止程序。遞歸深度是為了防止無限遞歸錯誤而設計的,當用戶編寫的正確遞歸程序需要超過1000層時,可以通過如下代碼設定:

??? import syssys.setrecursionlimit(2000)? #2000是新的遞歸層數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

主機訪問Android模擬器網絡服務方法

0x00 背景 因為公司的一個手機app的開發需求,要嘗試鏈接手機開啟的web服務。于是在Android Studio的Android模擬器上嘗試連接,發現谷歌給模擬器做了網絡限制,不能直接連接。當然這個限制似乎從很久以前就存在了。一直沒有注意到。 0x01 And…

分銷電商結算設計

概述 分銷電商中涉及支付與結算;支付職責是收錢,結算則是出錢給各利益方; 結算核心圍繞業務模式涉及哪些費用,以及這些費用什么時候通過什么出資渠道,由誰給到收方利益方; 結算要素組成費用項結算周期出…

區塊鏈的可拓展性研究【03】擴容整理

為什么擴容:在layer1上,交易速度慢,燃料價格高 擴容的目的:在保證去中心化和安全性的前提下,提升交易速度,更快確定交易,提升交易吞吐量(提升每秒交易量) 目前方案有&…

詳解進程管理(銀行家算法、死鎖詳解)

處理機是計算機系統的核心資源。操作系統的功能之一就是處理機管理。隨著計算機的迅速發展,處理機管理顯得更為重要,這主要由于計算機的速度越來越快,處理機的充分利用有利于系統效率的大大提高;處理機管理是整個操作系統的重心所…

前后端聯調神器《OpenAPI-Codegen》

在后端開發完接口之后,前端如果再去寫一遍接口來聯調的話,會很浪費時間,這個時候使用OpenAPI接口文檔來生成Axios接口代碼的話,會大大提高我們的開發效率。 Axios引入 Axios是一個基于Promise的HTTP客戶端,用于瀏覽器…

Go壓測工具

前言 在做Go的性能分析調研的時候也使用到了一些壓測方面的工具,go本身也給我們提供了BenchMark性能測試用例,可以很好的去測試我們的單個程序性能,比如測試某個函數,另外還有第三方包go-wrk也可以幫助我們做http接口的性能壓測&…

C# 任務并行類庫Parallel調用示例

寫在前面 Task Parallel Library 是微軟.NET框架基礎類庫(BCL)中的一個,主要目的是為了簡化并行編程,可以實現在不同的處理器上并行處理不同任務,以提升運行效率。Parallel常用的方法有For/ForEach/Invoke三個靜態方法…

Element-UI定制化Tree 樹形控件

1.復制 說明&#xff1a;復制Tree樹形控件。 <script> export default {data() {return {data: [{label: 一級 1,children: [{label: 二級 1-1,children: [{label: 三級 1-1-1}]}]}, {label: 一級 2,children: [{label: 二級 2-1,children: [{label: 三級 2-1-1}]}, {l…

Linux:進程優先級與命令行參數

目錄 1.進程優先級 1.1 基本概念 1.2 查看系統進程 1.3 修改進程優先級的命令 2.進程間切換 2.1 相關概念 2.2 Linux2.6內核進程調度隊列&#xff08;了解即可&#xff09; 3.命令行參數 1.進程優先級 1.1 基本概念 cpu資源分配的先后順序&#xff0c;就是指進程的優…

【C++】在類外部定義成員函數時,不應該再次指定默認參數值

2023年12月10日&#xff0c;周日下午 錯誤的代碼 #include<iostream>class A { public:void fun(int a10); };void A::fun(int a10) //<----在這里報錯 {}int main() {} 正確的代碼 代碼目前有一個問題&#xff0c;主要是在類外部定義成員函數時&#xff0c;不應該…

解密QQ號——C語言

題目&#xff1a; 有一串已加密的數字“6 3 1 7 5 8 9 2 4”解密規則&#xff1a;首先將第1個數字刪除&#xff0c;緊接著將第2個數字放到這串數字的末尾&#xff0c;再將第3個數字刪除并將第4個數字放到這串數字的末尾&#xff0c;再將第5個數刪除 代碼實現&#xff1a; #inc…

利用Node.js和cpolar實現遠程訪問,無需公網IP和路由器設置的完美解決方案

文章目錄 前言1.安裝Node.js環境2.創建node.js服務3. 訪問node.js 服務4.內網穿透4.1 安裝配置cpolar內網穿透4.2 創建隧道映射本地端口 5.固定公網地址 前言 Node.js 是能夠在服務器端運行 JavaScript 的開放源代碼、跨平臺運行環境。Node.js 由 OpenJS Foundation&#xff0…

ESP32網絡編程-OTA方式升級固件(基于Web瀏覽器)

OTA方式升級固件(基于Web瀏覽器) 文章目錄 OTA方式升級固件(基于Web瀏覽器)1、ESP32的OTA介紹2、OTA升級固件方式3、軟件準備4、硬件準備5、代碼實現6、一種優雅方式實現Web方式OTA升級6.1 基礎OTA代碼6.2 新固件庫代碼在前面的文章中,我們在Arduino IDE的網絡端口中,實現…

LeetCode 77.組合

題目&#xff1a; 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 方法&#xff1a;靈神-組合型回溯 剪枝 class Solution {private int k;private final List<Integer> path new ArrayList<>();…

反序列化 [網鼎杯 2020 朱雀組]phpweb 1

打開題目 我們發現這個頁面一直在不斷的刷新 我們bp抓包一下看看 我們發現index.php用post方式傳了兩個參數上去&#xff0c;func和p 我們需要猜測func和p兩個參數之間的關系&#xff0c;可以用php函數MD5測一下看看 我們在響應處得到了一串密文&#xff0c;md5解密一下看看 發…

Windows11安裝使用Oracle21C詳細步驟<圖文保姆級>新版本

Windows11安裝使用Oracle21C詳細步驟<圖文保姆級>新版本 Database Software Downloads | Oracle 中國 下載完成后解壓縮 雙擊setup.exe 打開安裝頁面 同意下一步 更改自己的路徑點擊下一步 輸入密碼 下一步安裝等待即可 等待加載配置時間有點久 完成即可 使用 搜索…

【Kubernetes】四層代理Service

Service四層代理 一、Service概念原理1.1、為什么要有Service1.2、Service概述1.3、工作原理1.4、三類IP地址【1】Node Network&#xff08;節點網絡&#xff09;【2】Pod network&#xff08;pod 網絡&#xff09;【3】Cluster Network&#xff08;服務網絡&#xff09; 二、S…

C++之異常處理

C語言傳統的處理錯誤的方式 傳統的錯誤處理機制&#xff1a; 1. 終止程序, 如assert. 缺陷: 用戶難以接受, 如發生內存錯誤, 除0錯誤時就會終止程序. 如果assert括號里面的表達式結果為假, 那么assert就會中斷程序并報錯, 所以使用assert可以幫助我們在程序判斷一些可能出錯的…

翻轉二叉樹(圖解、前序遍歷、遞歸與非遞歸)

LCR 144. 翻轉二叉樹 - 力扣&#xff08;LeetCode&#xff09; 給定一棵二叉樹的根節點 root&#xff0c;請左右翻轉這棵二叉樹&#xff0c;并返回其根節點。 示例 1&#xff1a; 輸入&#xff1a;root [5,7,9,8,3,2,4] 輸出&#xff1a;[5,9,7,4,2,3,8] 提示&#xff1a; …

【11】Qt Designer

目錄 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加載UI文件模板代碼 QMainWindow QWidget 常用知識點 1. 修改標題圖標 2. 圖片資源管理 3. 圖片按鈕 4. 加載對話框 5. 動態加載Widget 6. 修改主題 其他注意事項 事件被多次觸發 PyQt5提供了一個可視化圖形工…