遞迴和巢狀迴圈的區別

2022-02-18 13:28:15 字數 4264 閱讀 4007

遞迴和巢狀迴圈的區別

親,不要誤以為自己呼叫自己就等於遞迴了!

遍歷子節點

/// ///

當前節點

///關鍵字 void findchildnode(treenode tnparent, string

keystr)

}//////

展示符合條件的節點

/// ///

void

displaynode(treenode tn)

}//////

檢測當前節點

/// ///

///void checknode(treenode tn, string

keystr)

else

}//從低往高加

public

int sum23(int

param)

return

sum;

}//從高往第加

public

int sum1(int

param)

return

sum;

}public

int sum(int

param)

else

}public

long fac(int

n)

else

return

value;}}

}}其實,我也不知道第一種情況算不算嚴格意義上滴遞迴滴呀;

下面的方法是另外的一種方式來實現滴呀;

void findchildnode2(treenode tnparetn, string

keystr)

else}}

後面,我對遞迴由進一步的研究了,然後發現,我的結論可能是錯的;!!!

我們來看兩種遞迴的執**況;

沒有返回值,僅僅是又我們的臨界值;

///

///相當於乙個進棧和出棧的過程;當達到臨界值之後,就會回到開始點;

///進行出棧;

/// ///

public

static

void callself(int

n)

}

它的執行過程,可以這麼理解:

或者,你可以這麼理解它;

我擦,流程有夠醜的,不過相當直觀了,如果還不太清楚,你可以自己除錯一哈,跟著走一遍,就會有較為深刻的理解了;

這裡再貼出乙個fibo數的實現過程;

然後,我們來看乙個,有返回值的遞迴;

///

///call themself with return

/// ///

///public

static

int callselfwithreturn(int

n)

console.writeline(n);

return callselfwithreturn(--n);//

又重新回到這個點;

}

對這裡個理解,我們就可以使用,可以用第乙個圖來進行解釋,因為,這裡有乙個關鍵點;就是它會儲存,當時執行時的一些變數資訊;當回到遞迴的開始點時,又你能用到但是的些變數值;(這個是非常重要的點;)

我們再來看他隱身出的一些列的問題:

//

總的來說,它是利用了大頂堆的特性;

//乙個完整的堆定二叉樹,堆定都是乙個最大的資料;

//每次從堆定取出乙個數,然後此時堆,新的堆序列又亂了,然後有開始進行重新調整;然後

//堆疊,它每次回記得呼叫後的,當時的資料,以便在回到這個點的時候,繼續進行;

//而同樣的方法,我們可以使用for迴圈來實現;

public

static

void foreachimple(int

n)

}//////

其實,我們的遞迴方式,更像這種方式來執行的;

/// ///

public

static

void foreachimple2(int

n) }}

}//所以我們再遍歷,node的時候,常常會寫出這樣的**;

//我想看他是如何如構造一顆樹滴呀;

public

static listcreatenodes()

,newnode() }};

node node1 = new

node()

;node nodetop = new

node()

};list

list = new list();

list.add(nodetop);

return

list;

}public

static

void

iteori()

//}//}

///有節點,我們才進入我們的子節點中去進行遍歷,這個相當於我們的左節點遍歷;

//然後,我們就就有了下面的遍歷方式:遍歷的深度,無法動態的擴充套件

foreach (var topnode in

list)}}

}}//那麼還有沒有更好的方式去進行遍歷呢;

}

//就這樣簡單的試煉我們 節點的遍歷;(其實,這個就是我們的前序遍歷的實現)

public

static

void nodeitmeor(listnodes)}}

其實,在開發中,我們常常遇到這樣的場景;具有父子節點的集合(類似tree的結構);這個時候,我們需要把它組裝成符合tree nodes(能體現出層級關係的nodes關係圖);

下面我們看具體的例項;

///

///實際的測試方法;

///相當管用滴呀;

/// public

static

void

test()

,new node() ,

new node() ,

new node() ,

new node() ,

new node() ,

new node()

};var pnodes = listnodes.where(o=>o.pid==0

).tolist();

var childrends = listnodes.where(o=>o.pid!=0

).tolist();

foreach (var topnode in

pnodes)

}//////

/

/// ///

///public

static

void findchild(node parentnode, listnodes)}}

迴圈和遞迴的區別

對於遞迴和迴圈相比較 遞迴的 比較簡潔,容易讓別人理解,也容易讓自己理解,但是占用的空間非常大,有的時候在實現功能時,把所能用的空間全都用掉,可能還不夠,此時就會崩潰,而不進行任何操作,計算機不一定願意去實現,而且迴圈和遞迴實現同一功能時所用時間基本是沒有什麼差別的.解決問題方法的效率跟空間的利用效...

遞迴和迴圈的區別

斐波那契數列 迴圈演算法 總結 簡潔 清晰,並且容易驗證正確性。如果你真的理解了演算法的話,否則你更暈 它的執行需要較多次數的函式呼叫,如果呼叫層數比較深,需要增加額外的堆疊處理,比如引數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞迴,那將是極端難看的 明確遞迴終止條...

死迴圈和巢狀迴圈

死迴圈 也就是迴圈中的條件永遠為true,死迴圈的是永不結束的迴圈。例如 while true 在後期的開發中,會出現使用死迴圈的場景,例如 我們需要讀取使用者輸入的輸入,但是使用者輸入多少資料我們並不清楚,也只能使用死迴圈,當使用者不想輸入資料了,就可以結束迴圈了,如何去結束乙個死迴圈呢,就需要使...