1. 程式人生 > >遞迴再理解

遞迴再理解

其實關於遞迴,我也是比較模糊的,至今能理解和能用的遞迴演算法,基本是靠記憶和經驗,要是讓我自己設計一個遞迴,估計又得難半天,很早都想總結一下,喜歡瀏覽技術網

站,總是能找到好東西,現在將遞迴演算法總結如下,也不是多麼深刻,多麼高大上,可以說還是拙見吧:

》》》定義遞迴演算法:(基本思想)

 那麼什麼是遞迴演算法呢,遞迴的基本思想是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同一個方法,所以就產生了函式呼叫它自身的情況。敲打另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。以上這就是遞迴演算法的基本思想,也就這

麼多,下面看一個圖:


這既是一個最基本的的遞迴函式,函式體是:f(n) = f(n-1)*n;遞迴結束條件就是f(1) = 1;之後逐級返回,求出f(5),遞迴兩個過程完成。

》》》遞迴演算法的形象理解:

借用一個網友的說法:(關於門)

>>遞迴:你打開面前這扇門,看到屋裡面還有一扇門(這門可能跟前面開啟的門一樣大小(靜),也可能門小了些(動)),你走過去,發現手中的鑰匙還可以開啟它,你

推開門,發現裡面還有一扇門,你繼續開啟,。。。, 若干次之後,你打開面前一扇門,發現只有一間屋子,沒有門了。 你開始原路返回,每走回一間屋子,你數一次,走到入

口的時候,你可以回答出你到底用這鑰匙開了幾扇門。

>>迴圈:你打開面前這扇門,看到屋裡面還有一扇門,(這門可能跟前面開啟的門一樣大小(靜),也可能門小了些(動)),你走過去,發現手中的鑰匙還可以開啟它,

你推開門,發現裡面還有一扇門,(前面門如果一樣,這門也是一樣,第二扇門如果相比第一扇門變小了,這扇門也比第二扇門變小了(動靜如一,要麼沒有變化,要麼同樣的變

化)),你繼續開啟這扇門,。。。,一直這樣走下去。 入口處的人始終等不到你回去告訴他答案。

以上的話很好理解,遞迴和迴圈很好的區別開了,總的來說,遞迴,有去還有回;迴圈,有去無回;

》》》遞迴演算法的應用:

>>遞迴演算法,總的來說就是:《往深處遞->結束條件->歸隊》,但是,在實際應用中也不是說,一定是有去有回,其實還有有去無回,典型的就是分治思想。

遞迴依賴於要解決的問題,有的需要去的路上解決,有的需要回來的路上解決,還有來回的路上都不用解決問題,而是在遞的最後和歸的開始,也就是在最盡頭解決問題。

看幾個例子:

1.回來的路上解決問題:

問題描述:合併兩個有序的單鏈表,使用遞迴的思想;

有序連結串列合併,思想很簡單,直接看程式碼:

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
	if (pHead1 == nullptr)
		return pHead2;
	else if (pHead2 == nullptr)
		return pHead1;

	ListNode* pMergeHead = nullptr;

	if (pHead1->m_nValue < pHead2->m_nValue)
	{
		pMergeHead = pHead1;
		pMergeHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
	}

	else
	{
		pMergeHead = pHead2;
		pMergeHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
	}
	return pMergeHead;
}
每一次遞迴返回的都是一個節點,這個節點最終需要連線在上一個節點的後邊,一次遞到結束條件,回來依次連線各有序節點,這就是在歸回來的路上解決問題;

2.去的路上解決問題:

簡單,直介面述一個例子,比如一個二叉樹,在某種需要下,需要將二叉樹左邊的一路全部壓入棧中,在去的路上做的就是資料壓棧;

3.在盡頭解決問題:

	//遞迴查詢
	Node* _Find_R(Node* root, const K& key)
	{
		if (root == nullptr)
		{
			return nullptr;
		}

		Node* cur = root;
		if (cur->key == key)
		{
			return cur;
		}

		else if (cur->key > key)
		{
			_Find_R(cur->_left,key);
		}
		else if (cur->key < key)
		{
			_Find_R(cur->_right,key);
		}
		else
		{
			return nullptr;
		}
	}
以上是一個搜尋二叉樹的遞迴查詢函式,左右子樹遍歷,只為在某一個地方匹配到資料,然後返回,問題解決;

相關推薦

理解

其實關於遞迴,我也是比較模糊的,至今能理解和能用的遞迴演算法,基本是靠記憶和經驗,要是讓我自己設計一個遞迴,估計又得難半天,很早都想總結一下,喜歡瀏覽技術網 站,總是能找到好東西,現在將遞迴演算法總結如下,也不是多麼深刻,多麼高大上,可以說還是拙見吧: 》》》定義遞迴演算法

理解和例子

''' # 遞迴函式 - 優點: _直接簡潔 -缺點: _對遞迴有限制超過報錯(100層)[設定遞迴最大層數 import sys sys.setrecursionlimit(設定遞迴的頂層)] _消耗資源大 ''' # 一個簡單的遞迴 ''' X = 0 def fun

對於理解

有很多時候我們可能會遇到使用遞迴的問題來解決問題,其中我感覺遞迴最重要的是把大的問題一步步地進行分解成小的問題 所以首先要對問題進行分割,其中可能涉及到了一些分割問題的技巧 其次,分割成小問題之後我們要確定遞迴的方法中的引數,有多少個變數在變化,需要傳進方法中引數有多少,遞迴呼叫的時候引數該

兔子生兔子理解

重要的是找規律! 古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少? 月份  兔子對數 1    1 2    1 3    2 4    3 5    5=2+3 6

Java淺談理解

      遞迴方法其實就是一個直接或者間接呼叫自己的方法,是一個簡單、實用的方法,在遇到某些不好解決的問題時,可以用遞迴方法來解決,比如:求一段連續自然數之間的和、階乘等等。下面我簡單講講遞迴方法到底是怎麼個情況。       先來一段程式碼: public clas

我對理解

我沒有怎麼系統的學過遞迴,我只好用例子講了。如下: class Demo { public static void main(String[] args){ doubleNum(1237); Num(10); } public st

漢諾塔演算法理解及實現

漢諾塔:(Hanoi)是一種玩具,如圖: 從左到右 A B C 柱 大盤子在下, 小盤子在上, 藉助B柱將所有盤子從A柱移動到C柱, 期間只有一個原則: 大盤子只能在小盤子的下面. 問題理解與描述: 1.問題的理解與描述 問題的形式化表示為:

理解問題

雖然能理解遞迴,但是總覺得理解起來非常不通暢。網上/書上看了不少,總覺得不滿意。 首先,能清晰的理解A中調B,是因為A與B都是獨立個體,比如說看電視時,拿遙控器就如同在呼叫B。 但是,在A中呼叫A的話,到底該怎麼理解呢? 我的理解(希望對你有些幫助): A-&g

LeetCode總結,理解與設計

一,簡介遞迴的原理 遞迴演算法:是一種直接或者間接地呼叫自身的演算法。在計算機編寫程式中,遞迴演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。 1,參考於書籍中的講解: 遞

C語言學習第23篇---函式理解

遞迴函式:自己呼叫自己,是子函式實現的基礎。遞迴之所以能實現,是因為函式的每個執行過程在棧中都有自己的形參和區域性變數的副本,這些副本和該函式的其他執行過程不發生關係但是遞迴函式在深層迴圈時效率很低,所

演算法入門——理解

        在計算機這個行業,特別是做演算法的萌新們,在學習演算法或者程式設計時都會遇到一個問題,那就是遞迴。對於遞迴,再書上通常就是這樣一句話,程式或者方法自己呼叫自己。萌新們的問題可能就出在這句話上了,那麼究竟什麼叫做自己呼叫自己呢?這怎麼個呼叫的方式呢?是把自己所

我對理解和總結

看了自己的動態記錄,發現自己已經遺忘了曾經的自己,有一條動態,2013年的時候,我看了一篇關於尾遞迴的博文,那時候還只是一個初學者,胡亂評論了一下,作者希望我能寫一篇博文發表一下自己的看法,當時沒有寫,然而現在卻想寫點什麼總結一下,不保證說的沒問題,只希望如果有像我當年一樣的初學者看到,可以參考借鑑,或許能有

如何僅用函式和棧操作逆序一個棧——你要先用stack實現,去改成——需要對理解很深刻才能寫出來

/** * 如何僅用遞迴函式和棧操作逆序一個棧 * 題目: * 一個棧依次壓入1,2,3,4,5,那麼從棧頂到棧底分別為5,4,3,2,1。 * 將這個棧轉置後,從棧頂到棧底為1,2,3,4,5,也就是實現棧中元素的逆序, * 但是隻能用遞迴函式來實現,不能用

自學C之理解

一、 理解概念   C語言允許一個函式呼叫自身,這種過程被稱為遞迴(Recursion)。程式使用遞迴處理特殊的問題,如階乘、 Ackermann函式,反序等等。實際上,如果不考慮執行時記憶體的開消,任何使用賦值語句、if-else和while結構的函 數都可以用遞迴方式重寫。

深入理解思想

1、什麼是遞迴 本質上,將原來的問題轉換為更小的同一問題。問題規模可以不斷縮小,直到達到一個不能再縮小的基本問題,解決這個基本問題,就解決了整個問題。 例如,使用遞迴思想對自然數1、2、3…n-1 、n求和: sum(n) = n +sum(n-1); //sum(n-1)就是被

全面分析動手的習慣:連結串列的反轉問題(和非方式)

https://www.cnblogs.com/kubixuesheng/p/4394509.html dashuai的部落格 要麼牛B!要麼滾!   首頁   聯絡 訂閱 管理 隨筆-88  文章-0 

掌握歸併排序前首先理解行為

剖析遞迴行為 遞迴行為 遞迴的聯想理解 遞迴的基本思想 舉個例子 深入剖析遞迴行為 遞迴行為的複雜度 一些補充 遞迴行為 “大事化小” 講的就是一個遞迴的思想,把一個規模大的問題通過劃分成小問題去解決,小問題繼續

java從《《函式》》到《《歸併排序》》到《《最小和問題(歸併排序的應用)》》:

一:我們首先來研究一下遞迴函式(使用遞迴函式求陣列最大值): 我們開始把陣列分為兩半,分別找出最大值,那麼這個最大值就是最後的最大值:同時我們左右兩邊繼續細分,停止條件就是細分到單個數值為止。 package chapter1; //使用遞迴求出一個數組中的最小值 public class

歸併排序理解

https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F 先上一個網站,這個網站一定要看。 點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。 你可以看到圖裡面的數分了四層,然後

c#理解

什麼是遞迴函式? 任何一個方法既可以呼叫其他方法又可以呼叫自己,而當這個方法呼叫自己時,我們就叫它遞迴函式或者遞迴方法! 說白了,就是呼叫自己。 通常遞迴有兩個特點:     1.遞迴方法一直會呼叫自己直到某些條件滿足,也就是說一定要有出口; 2.遞迴方法會有一些引數,