最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++顯式棧實現(xiàn)遞歸介紹

 更新時間:2022年01月06日 16:50:39   作者:qhh_enen  
大家好,本篇文章主要講的是c++顯式棧實現(xiàn)遞歸介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

前言

在大學(xué)的課上老師有教過,也就是用循環(huán)來實現(xiàn)遞歸,現(xiàn)在自己回顧一下并且做一下記錄。

1. 遞歸

假設(shè)有函數(shù)A, 和函數(shù)B, 函數(shù)B是一個遞歸函數(shù), 函數(shù)A調(diào)用函數(shù)B。
這個遞歸的過程分為:

函數(shù)A調(diào)用函數(shù)B,函數(shù)A將數(shù)據(jù)傳給函數(shù)B。此時進入到函數(shù)B內(nèi)部,函數(shù)B通過傳參拿到函數(shù)A傳過來的數(shù)據(jù)。執(zhí)行本次調(diào)用的操作將新的數(shù)據(jù)作為參數(shù)傳入函數(shù)B(遞歸過程, 內(nèi)部再次執(zhí)行2~3步驟,以此類推)。退出遞歸結(jié)束。

2. 顯式棧實現(xiàn)的思路

由上面的過程可以不難看出,遞歸的過程遵循 后進后出 這樣的一個規(guī)律。那么就很容易聯(lián)想到具有同樣特征的棧這樣一個數(shù)據(jù)結(jié)構(gòu)。這里給出顯式棧實現(xiàn)遞歸的思路:
假設(shè)已經(jīng)申請了一個stack的容器,

首先將初始數(shù)據(jù)壓棧,這個類似于遞歸過程中的函數(shù)A最開始調(diào)用函數(shù)B時將數(shù)據(jù)傳入的操作。接下來是循環(huán)操作,條件是true,也就是死循環(huán), 這個類似于函數(shù)B內(nèi)部一直遞歸調(diào)用,至于什么時候結(jié)束取決于什么時候遇到遞歸出口;在這個死循環(huán)里應(yīng)該在每次循環(huán)時進行一次條件判定,這個條件判定相當(dāng)于遞歸函數(shù)中決定什么時候返回的條件判定;接下來進到循環(huán)內(nèi)部,首先取棧頂數(shù)據(jù)出來,這類似函數(shù)B內(nèi)部取到了傳參執(zhí)行 本次的循環(huán)的關(guān)鍵操作,處理數(shù)據(jù)的任務(wù)將新的數(shù)據(jù)壓棧,這部分相當(dāng)于將新的數(shù)據(jù)作為參數(shù)傳入函數(shù)B如果觸發(fā)了循環(huán)退出條件,則退出循環(huán)

3. 代碼解析

上面說了具體思路,現(xiàn)在用代碼來說明,首先上遞歸的寫法, 用遍歷二叉樹作為例子。

#include<iostream>
using namespace std;
class Node
{
public:
	int value;
	Node* left_child;
	Node* right_child;
	Node(int data)
	{
		this->data = data;
		this->left_child = nullptr;
		this->right_child = nullptr;
	}
};

void B(Node* node)
{
	//這個時候已經(jīng)經(jīng)歷了步驟2, 函數(shù)B拿到了數(shù)據(jù)root
	// 步驟3,執(zhí)行本次遞歸調(diào)用的關(guān)鍵操作
	cout << node->data<< endl; 
	// 步驟4,拿到新的數(shù)據(jù)root->left_child和root->right_child
	//調(diào)用函數(shù)B
	if (node->left_child) B(node->left_child);
	if (node->right_child) B(node->right_child);
	//步驟5,遞歸結(jié)束
}

void A()
{
	Node root(10);  //模擬一顆樹
	B(&root); //步驟1,傳參
}

int main()
{
	A();
}
以上步驟3和步驟4的順序不是固定的,他們順序的不同各自構(gòu)成了不同的樹遍歷方法(先序,中序,后序遍歷)。接下來是顯式棧實現(xiàn)的寫法
#include<iostream>
#include<stack>
using namespace std;
class Node
{
public:
	int value;
	Node* left_child;
	Node* right_child;
	Node(int data)
	{
		this->data = data;
		this->left_child = nullptr;
		this->right_child = nullptr;
	}
};

int main()
{
	Node root(10);  //模擬一顆樹
	stack<Node*> m_stack;
	m_stack.push(&root); //步驟1,將根節(jié)點壓棧, 相當(dāng)于函數(shù)A調(diào)用函數(shù)B時傳參
	while(true)
	{
		if (m_stack.empty())
		{
			break; 
			//這里相當(dāng)于步驟5,判定循環(huán)結(jié)束條件, 也可以寫到while條件上
			//為了思路更清晰,所以寫在循環(huán)里面,也更好跟遞歸版本進行比較
		}
		//步驟2,取棧頂元素
		Node* current_node = m_stack.top();
		m_stack.pop();
		//步驟3,執(zhí)行本次循環(huán)的關(guān)鍵操作
		cout << current_node->data<< endl;
		//步驟4, 拿到新的數(shù)據(jù)并且壓棧
		if (current_node->left_child)
			m_stack.push(current_node->left_child);
		if (current_node->right_child)
			m_stack.push(current_node->right_child);
	}
}
顯式棧實現(xiàn)的版本里,有一個細節(jié)就是取完棧頂數(shù)據(jù)之后需要將棧頂?shù)臄?shù)據(jù)出棧,這樣才能使用棧是否空來判斷遞歸出口。

到此這篇關(guān)于c++顯式棧實現(xiàn)遞歸介紹的文章就介紹到這了,更多相關(guān)c++遞歸內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VS2022 CUDA環(huán)境配置的實現(xiàn)步驟

    VS2022 CUDA環(huán)境配置的實現(xiàn)步驟

    本文主要介紹了VS2022 CUDA環(huán)境配置的實現(xiàn)步驟,文中通過圖文示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C++ auto自動類型推導(dǎo)規(guī)則和使用詳解

    C++ auto自動類型推導(dǎo)規(guī)則和使用詳解

    C++11 賦予 auto 關(guān)鍵字新的含義,使用它來做自動類型推導(dǎo)。也就是說,使用了 auto 關(guān)鍵字以后,編譯器會在編譯期間自動推導(dǎo)出變量的類型,這樣我們就不用手動指明變量的數(shù)據(jù)類型了
    2022-08-08
  • C++11中的chrono庫詳解

    C++11中的chrono庫詳解

    C++11提供了日期時間相關(guān)的庫chrono,通過chrono庫可以很方便的處理日期和時間,這篇文章主要介紹了C++11中的chrono庫,需要的朋友可以參考下
    2023-03-03
  • 淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解

    淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解

    本篇文章是對C++日志系統(tǒng)log4cxx的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt6實現(xiàn)調(diào)用攝像頭并顯示畫面

    Qt6實現(xiàn)調(diào)用攝像頭并顯示畫面

    這篇文章主要為大家詳細介紹了Qt6如何實現(xiàn)調(diào)用攝像頭并顯示畫面的效果,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • opencv實現(xiàn)圖片與視頻中人臉檢測功能

    opencv實現(xiàn)圖片與視頻中人臉檢測功能

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)圖片與視頻中人臉檢測功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言之選擇分支語句詳解

    C語言之選擇分支語句詳解

    大家好,本篇文章主要講的是C語言之選擇分支語句詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言控制臺版2048小游戲

    C語言控制臺版2048小游戲

    本文給大家分享的是2則使用C語言控制臺編寫的2048小游戲,各有優(yōu)劣,小伙伴們對比著參考下吧。
    2015-03-03
  • C語言算法--有序查找(折半查找/二分查找)

    C語言算法--有序查找(折半查找/二分查找)

    我們知道無序查找只能靠遍歷,如果有序查找我們還挨個去遍歷,未免太浪費時間,所以這里我們會用到不一樣的方法,希望能給你帶來幫助
    2021-08-08
  • C語言實現(xiàn)點餐系統(tǒng)

    C語言實現(xiàn)點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論

土默特右旗| 永宁县| 根河市| 格尔木市| 金坛市| 长沙市| 金秀| 耿马| 萨嘎县| 镇原县| 天全县| 马山县| 十堰市| 华容县| 博兴县| 太谷县| 桃园县| 富宁县| 五莲县| 阿瓦提县| 九龙城区| 崇州市| 太白县| 钟山县| 鱼台县| 灯塔市| 嘉义市| 建宁县| 兴海县| 龙海市| 柳林县| 凭祥市| 庄浪县| 龙门县| 永丰县| 成安县| 比如县| 六盘水市| 巴林左旗| 陆河县| 剑河县|