【算法】學習筆記(2):遞歸思想

0 回顧

之前的筆記(0)和筆記(1),我們介紹了算法的基本含義,并且舉了一些實例,同時理解了,算法就是人類在教計算機做事情!

我們知道,算法就是解決問題的方案,我們將自然語言描述的問題,轉換為符號語言,再解決問題,使用計算機思維,構建解決問題的算法,最后轉換為計算機可以識別的語言,教會計算機,讓它幫助我們解決問題。

在算法設計的時候,我們需要關注其時間和空間的復雜度,這與實際問題有關,可能關注事件,也可能關注空間,也可能二者兼有。

下面,我們來看看遞歸思想,并且使用實例來理解抽象的思想。

1 遞歸思想

遞歸是可能計算機與人類最大的不同,人類是遞推思維,能夠發散,計算機是遞歸思維,能夠做重復且簡單的固定事情。

因此,我們教計算機做事的時候,要盡可能簡單且固定,也就是,我們需要將一個復雜的問題,拆解成若干小問題,這些小問題最好還是已知的,已經被解決的,這樣,我們就很容易能夠設計出一個算法,并且教會計算機做事。

1.1 遞歸的含義

所謂的遞歸,看起來就像:同樣的一件事情,做了很多遍,雖然每一次的代碼一樣,但是每一次的數據不一樣,導致行為不一樣,并且,會有一個盡頭,一旦走到盡頭了,就得原路返回來。

我們看一個例子
在這里插入圖片描述

#include <iostream>
using namespace std;void story(int i) {if (i > 10)return;cout << "從前有個廟,廟里有個老和尚,老和尚給小和尚講故事" << endl;cout << "講的故事是什么呢?講的是:" << endl;story(i + 1);
}int main()
{story(1);return 0;
}

這就是生活中的一個遞歸的例子,還蠻有趣的!

注意,它并不是循環!與循環還是有差別的,最重要的就是,遞歸在條件終止之后,會返回來,而循環,條件終止就停了。

1.2 遞歸算法的重要結構

  1. 終止條件 & 終止處理辦法
  2. 遞歸處理方法

在這里插入圖片描述

我們知道,遞歸不可能無限進行下去,因此需要終止條件,以及觸發該條件后對應的處理方案。

并且,更重要的是,我們需要知道遞歸如何處理

對于遞歸程序,通常都是解決一個小問題

我們將一個大問題分解成若干個小問題,然后,這些小問題的處理方式是相似的,我們用遞歸來分別解決每一個小問題,得到每個小問題的解,之后將這些解合并。

階乘問題

在這里插入圖片描述
先列出遞歸方程,再轉換為程序即可。

// 階乘問題
int factorial(int n) {if (n <= 0)return 1;elsereturn n * factorial(n - 1);
}

如果不用遞歸呢?

使用遞推! 從1到n.用循環搞定。

// 不用recursion的階乘,遞推
int factorial2(int n) {if (n == 0)return 1;int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}

遞歸特點:有去有回!從n到1!從結果到起點,再返回來。

對于遞歸來說,最開始目標的n就是已知的,然后逐漸變化到臨界值,經過層層處理,再返回來。關鍵點:遞歸方程!

斐波那契數列

遞歸方程

  1. f(n) = 1,n = 1或n = 0
  2. f(n) = f(n-1) + f(n-2),n > 1
// 斐波那契數列
int fib(int n) {if (n == 1 || n == 0)return 1;return fib(n - 1) + fib(n - 2);
}

在這里插入圖片描述
迭代:就是重復執行一些指令,指令是一定的,但是相關的數據是變化的。

遞歸調用的過程,終點參數在不斷變化,一直在逼近終點,最終停下來,依次返回。

小結

我們先將一個問題,使用符號語言描述,拆解問題,將其轉換成遞歸方程,使用數學語言描述,然后將其轉換為算法和實際的程序。

所謂的遞歸,就是先給出終點參數,它是復雜的,然后隨著參數的減小,會逐漸簡單,然后得到最簡單的結果,之后再往回走,就能獲得復雜問題的結果。

這與人類思維不一樣,人類通常是遞推,先解決簡單問題,再逐漸復雜化,最終解決復雜問題。

因此,求解問題的時候,可以簡單問題找規律,最終獲得復雜抽象的方程,從而獲得最終結果。

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

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

相關文章

【計算機系統設計】實踐筆記(5)插敘:內外有別之CPU和Memory

區分CPU的內外 首先明確&#xff0c;內存&#xff0c;不在CPU內&#xff0c;我們的CPU是會有數據和指令端口的&#xff0c;然后去訪問內存和外設。 而CPU設計&#xff0c;我們所說的單周期&#xff0c;多周期和流水線&#xff0c;描述的都是CPU&#xff0c;而不是Memory&…

【計算機系統設計】實踐筆記(5)改進數據通路:beq和bne指令分析與實現

接下來的分析和實踐非常粗糙&#xff0c;因為跟之前一樣的分析流程&#xff0c;不再多說了&#xff0c;如果前面真的掌握&#xff0c;這里不看也罷。 分析 先看beq指令。 ALU輸入的是rs和rt&#xff0c;不輸入imm&#xff0c;進行subu操作&#xff0c;判斷是否為zero&#x…

【算法】學習筆記(4):分治思想 歸并排序

分治思想&#xff0c;分治策略&#xff0c;自古有之&#xff0c;與人類生活息息相關&#xff0c;其本質是將大問題拆解為小問題&#xff0c;小問題轉換為已知解的問題&#xff0c;進而求解。 軍隊管理&#xff0c;國家分級治理…… 大規模數據排序&#xff0c;例如10000000000…

【算法】學習筆記(5):快速排序

注意一個C的坑 sizeof()這個函數靜態數組可以求長度&#xff0c;動態new出來的數組不行&#xff0c;因為針對的是指針……&#xff0c;不過既然的動態數組了&#xff0c;其長度本身必然是一個變量了&#xff0c;你沒有必要這么求長度。 下面看快速排序的代碼。 #include <…

【計算機系統設計】實踐筆記(6)改進數據通路:lw和sw指令

不想多說了……前面的鋪墊足夠了&#xff0c;剩下的自己做做應該也會了&#xff0c;如果遇到問題&#xff0c;就搜一下自己查閱就好。 這篇水過&#xff0c;沒有太多技術點。 唯一注意的是&#xff0c;引入的RAM和ROM的clk觸發問題&#xff0c;可能引起時序問題&#xff0c;等…

html css 核心設計理念

分開看&#xff01; 從不同視角&#xff0c;獨立地去看某一部分內容&#xff0c;使用聚焦視角&#xff0c;進行獨立操作和批量操作。

html css 學習筆記(1)背景相關

背景顏色 圖片 插入圖片img背景圖片 背景圖片 3. logo 4. 大圖 5. 裝飾性小圖 便于控制位置&#xff01; 插入后會執行自動平鋪&#xff0c;這與插入圖片是不同的&#xff01; div{width: 600px;height: 300px;background-image: url(img/登錄用戶頭像.png); }小結 盒子的第…

html css a標簽的應用

作為普通鏈接轉換為行內塊元素 轉換為行內塊元素之后&#xff0c;就可以給其各種塊行為&#xff0c;加背景&#xff0c;加背景圖片&#xff0c;設置寬高&#xff0c;內外邊距…… 塊行為可以的&#xff0c;它都行&#xff0c;唯一的區別&#xff0c;它這個盒子是個鏈接&#…

GitHub回滾

不要直接退回到很久前的歷史版本&#xff0c;這很可能引起文件沖突&#xff0c;可以一步步回滾&#xff0c;先回滾最近的&#xff0c;從近到遠一步步滾到目標。

2020-12-15 CPU設計復盤

SOC修改 將之前完成的31條指令單周期CPU進行了重構&#xff0c;將其分開&#xff0c;實現了內外有別&#xff0c;將CPU、指令ROM和數據RAM。 這樣&#xff0c;以后為其增加接口外設&#xff0c;總線控制&#xff0c;才更加清晰&#xff0c;這是進一步封裝和抽象。 MARS大坑 …

Tomcat 學習筆記(0)

JavaWeb 用Java寫的程序&#xff0c;可以在瀏覽器運行。 Request & Responce Web資源 Web服務器 我們在自己的主機啟動Tomcat服務器&#xff0c;然后運行它&#xff0c;就能夠通過主機訪問這個服務器&#xff0c;這個服務器能夠運行我們的程序。 部署Web工程 法1 將web…

計算機系統 學習筆記(0)南京大學(一)第一周

課程&#xff1a;計算機系統基礎 核心理念&#xff1a;人類世界與計算機世界的異同 人類世界 直觀感受數學 計算機世界 與數學不同&#xff0c;存儲首先&#xff0c;各層次與現實世界不同 我們關注點是差異點&#xff01; 一樣的你就不用關心了&#xff0c;關心差異&#…

x86架構下 CF與OF標志位 帶符號和無符號運算 詳解

針對能夠影響OF和CF標志位的指令&#xff0c;一般來說是涉及到數據運算的指令&#xff0c;這里使用add舉例&#xff0c;即不區分有無符號的加法指令&#xff0c;參與運算的數據&#xff0c;從二進制層級去考慮。 CF標志位 對于CF&#xff0c;它是carry flag&#xff0c;進位標…

tmux學習筆記

參考學習鏈接 我們需要理解幾個重要的概念 session 回話window 窗口pane 窗格 window 我們打開的一個terminal就是一個window. 而打開的這個window&#xff0c;也就是打開了一個session&#xff0c;打開window&#xff0c;session開始&#xff1b;關閉window&#xff0c;se…

安裝win10和Linux雙系統的個人經驗

使用easy uefi誤刪除win10引導文件 這個時候&#xff0c;網上教程有各種方式&#xff0c;我直接使用了一種最簡單的&#xff0c;這個方法網上都沒有提到過。 注意&#xff1a;發現引導文件刪了&#xff0c;千萬不要關機&#xff0c;否則再想開機恐怕只能重裝系統了。 我們直…

Linux的ext4文件系統學習筆記

補充&#xff1a;設備獨立性 Linux中&#xff0c;設備驅動以文件形式表示&#xff0c;用戶操作邏輯設備就是操作文件&#xff0c;而不是具體的物理設備&#xff0c;也就是說&#xff0c;用戶操作的是功能&#xff0c;是黑箱&#xff0c;而不是真正的實體。 APP操作的都是邏輯…

html基礎元素案例筆記(1)

這是代碼 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS FlexBox test</title><link rel"stylesheet" type"text/css" href"./css/index.css"></head><body>…

C語言中的struct和union區別

參考&#xff1a;Difference between Structure and Union in C 二者區別 struct 這里不做詳細說明&#xff0c;因為參考鏈接中都寫明了。只做一些重點強調。 struct中聲明的變量&#xff0c;在分配空間的時候&#xff0c;struct結構空間大小&#xff0c;大于等于其內部所有…

C語言多文件編譯鏈接為1個可執行文件的簡單原理

參考1&#xff1a;C header files and compilation/linking 參考2&#xff1a;計算機系統基礎&#xff08;一&#xff09;袁春風 &#xff08;符號鏈接部分&#xff09; 我們現在有一個簡單的工程&#xff0c;有這么幾個文件 1.t1.h extern int x;void tt();t1.c #include &…

Java讀寫二維數組到文件

1. 創建文件 使用了File類中的createrNewFile方法。 public static boolean createFile(String filename){try{File file new File(filename);file.createNewFile();return true;} catch (IOException e) {e.printStackTrace();return false;}}查閱文檔可知&#xff0c;若文件…