遞迴演算法一般上是否都可以用棧進行模擬

2025-07-20 01:05:21 字數 3202 閱讀 2996

1樓:匿名使用者

是的,遞迴演算法採用函式呼叫構造出來的棧儲存函式內部的區域性變數,這和手工構造乙個棧儲存這些變數的作用是一樣的。另外可以證明遞迴演算法都可以轉換成迭代演算法,雖然迭代演算法難懂一點但佔用的記憶體會小很多。

在先序、中序非遞迴演算法中為什麼使用棧?能不能借助其它資料結構來實現?vc++

2樓:匿名使用者

因為先序和中序遍歷需要多次經過結點,但不會訪問,用非遞迴演算法需要記錄所經過的路徑,這樣便於返回。用什麼結構倒不是關鍵的,主要的是你要保證儲存它的資料結構的存取順序,先進的後出。

3樓:小太陽

#include

using namespace std;

#include

#include

#include

#define maxsize 20 //最大結點個數。

#define n 14 //必須輸入結點個數(包含虛結點)

#define m 10 //最大深度。

typedef struct nodebitree;

bitree*q[maxsize];

bitree*creatree()

rear++;

q[rear]=s;

if(rear==1)

elseelse

if(rear%2==1)

front++;

/i++;cin>>ch;

return t;

int countleaf(bitree* t)

int treedepth(bitree *t)

void output(bitree*t) //輸出列印二叉數。

coutoutput(t->lchild );

int menu_select( )

return sn;

int main( )

return 0;

*void main()*/

在先序中序非遞迴演算法中為什麼使用棧?能不能借助其他資料結構來實現?

4樓:網友

#include

using namespace std;

#include

#include

#include

#define maxsize 20 //最大結點個數。

#define n 14 //必須輸入結點個數(包含虛結點)

#define m 10 //最大深度。

typedef struct nodebitree;

bitree*q[maxsize];

bitree*creatree()

rear++;

q[rear]=s;

if(rear==1)

elseelse

if(rear%2==1)

front++;

/i++;cin>>ch;

return t;

int countleaf(bitree* t)

int treedepth(bitree *t)

void output(bitree*t) //輸出列印二叉數。

coutoutput(t->lchild );

int menu_select( )

return sn;

int main( )

return 0;

*void main()*/

將遞迴演算法轉換成對應的非遞迴演算法時,通常需要使用的資料結構是() a 棧 b 佇列 c 連結串列 d 樹

5樓:鷹眼不是漆無害

a 棧。這裡的棧即是指堆疊,是一種先進後出的資料結構。系統實現遞迴時,本身也是用堆疊實現的,用來儲存現場資訊。

遞迴演算法使用的資料結構是棧嗎

6樓:網友

不是。遞迴就是遞迴,只是用棧可以完成遞迴的功能。

7樓:網友

遞迴演算法有很多形式,程式設計時不一定用棧。但系統在處理遞迴程式時會用棧控制遞迴的執行!

資料結構中寫乙個非遞迴演算法中序遍歷非線索二叉樹,但不能用任何輔助棧

8樓:十字風信

不能用輔助棧怎麼搞。開乙個陣列模擬棧也不行嗎?存樹的空間都能花棧的空間也不缺吧。

自己寫棧來代替遞迴,有必要嗎

9樓:春也春風日放飛

以下是比較全面的解釋,可以看看。 遞迴演算法是一種直接或者間接地呼叫自身的演算法。在計算機編寫程式中,遞迴演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。

遞迴演算法解決問題的特點: (1) 遞迴就是在過程或函式里呼叫自身。 (2) 在使用遞迴策略時,必須有乙個明確的遞迴結束條件,稱為遞迴出口。

3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。 (4) 在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。

遞迴次數過多容易造成棧溢位等。所以一般不提倡用遞迴演算法設計程式。

資料結構和演算法,遞迴運算時所用的遞迴棧是否算空間複雜度?

10樓:二十一弦

不算,演算法不考慮具體實現技術所耗用的額外的執行時間和空間。最典型的乙個演算法是:計算斐波那契數列f(n)=f(n-1)+f(n-2),在遞迴的情況下空間複雜度是常數。

但是在c/c++下其實背後耗掉的記憶體空間是大於o(n)的,但是在其他編譯器下可能就真的是常數,而演算法是很純粹的,他只考慮自己演算法執行時候用來儲存他需要或者他產生的資料所耗掉的空間。

11樓:網友

首先,函式本身也是在記憶體中佔空間的,主要用於儲存傳遞的引數,以及呼叫**的返回位址。

函式的呼叫,會在記憶體的棧空間中開闢新空間,來存放子函式。遞迴函式更是會不斷佔用棧空間,例如該階乘函式,到最後n=1時,記憶體中會存在factorial(100), factorial(99), factorial(98) .factorial(1)這些函式,它們從棧底向棧頂方向不斷擴充套件。

當遞迴過深時,棧空間會被耗盡,這時就無法開闢新的函式,會報出stack overflow這樣的錯誤。

所以,在考慮空間複雜度時,遞迴函式的深度也是要考慮進去的。

功夫茶都可以用什麼茶泡功夫茶時一般都用什麼茶泡?

一般福建安溪的鐵觀音為上選,最好是用泉水泡製,口感更佳。功夫茶所用的茶葉,只限於半發醇的福建巖茶,溪茶和潮汕的鳳凰水仙一類 均屬青茶類 中國的其它茶類如紅茶,綠茶,磚茶,或花茶,白茶等則不適合 功夫茶具包括 四件寶 孟臣衝罐 若琛甌 玉書鍋 紅泥烘爐。功夫茶所用的茶葉,只限於半發醇的福建巖茶,溪茶和...

任何有理數都可以用數軸上的點來表示

有理數都可以用數軸上 點 來表示,正數用 原點右邊的 點來表示,負數用 原點左邊的 點來表示,零用 原點 任何有理數都可以用數軸上 唯一 的一個點來表示。任何一個有理數都可以用數軸上的一個點來表示對嗎 任何一個有理數都可以用數軸上的一個點來表示,是這樣的。是的沒錯,任何有理數都能在數軸上表示 無理數...

英語是否全部都可以用日語的羅馬音讀出來

在日本的確可以把英語都看作羅馬拼音讀,其實在日本很多時候都是用平假名諧音表示英文的。但是也因為這個日本人的英語口語普遍不咋地。就像我們學英語用中文注音一樣,其實是讀不太準的。建議別這麼幹。死板的話,因人而異吧,關鍵是根據自身條件制定適當的學習方法。所有羅馬音用英語的怎麼讀,解決讀音問題,注意 我不是...