遞歸
先來看下treeview的簡單應用:
一、nodes
二、往節點里面添加內容
下面再給大家復習下遞歸:
什么叫遞歸呢?“和尚講故事”,就是方法自己調自己,這就是遞歸。
三、方法自己調自己
我們先調下T1方法,讓大家看個東西:
四、讓大家看的東西
五、調用堆棧
用堆棧來監視一下:
一開始調了main方法
再調T1方法
再調T2方法
注意一下順序,類似於棧結構,先進來在最下面,后進來在最上面。
剛T2方法執行完畢,T2方法沒了。
調完之后,從棧里面出來了。
再看下我調Say方法。
一開始還是調的main方法,
一直在調Say方法,這個棧越來愈大,直到系統報錯。
六、溢出,系統報錯
遞歸里面注意的地方:一定要有終止條件。
接下來我們看兩個例子:
七、這個方法的執行結果是什么呢?
如果代碼中加上:index++; 又是什么答案呢?
不讓用VS測試的時候,自己可以在紙上用紙和筆划一下。
有一些個公司喜歡用這種裝逼的題目當面試題的。
答案是4a4b,為什么是這樣呢?
我們畫圖進行分析:
八、例一分析圖示
對於初學者來講,這幅圖可能還是比較的抽象,所以,建議調試一下。
九、例一分析圖示二
十、例二代碼
大家再想想,這段代碼的輸出結果。考驗人類思維極限呦。
下面我們還是畫個圖就行演示:
十一、例二分析圖
n在自己的作用域范圍內,互不影響。
在做一個程序的時候,能用循環做的,就不要用遞歸來做。用遞歸的話,效率極其低下。
想深入研究的朋友可以看下關於:尾遞歸優化的問題。
在上面兩個題目中遞歸因為棧,才能記住,執行完后面調的方法之后返回去調沒有執行完的方法里面的語句。
下面我們看下遞歸加載和遞歸刪除:
十二、TreeView控件的基本使用
點擊按鈕加載表中數據到TreeView上。
遞歸加載子節點插入代碼位置:

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Data.SqlClient; 10 11 namespace _04數據遞歸加載到TreeView與遞歸刪除 12 { 13 public partial class Form1 : Form 14 { 15 public Form1() 16 { 17 InitializeComponent(); 18 } 19 20 private void Form1_Load(object sender, EventArgs e) 21 { 22 //1.窗體運行的時候,把節點清空 23 treeView1.Nodes.Clear(); 24 //3.加載父id為0的數據到treeview以及父id對應的值。 25 DataTable dt = GetDataByParentId(0); 26 LoadCity(treeView1.Nodes, dt); 27 } 28 //4.循環進行綁定 29 private void LoadCity(TreeNodeCollection treeNodeCollection, DataTable dt) 30 { 31 //遍歷dt中的每一行 32 foreach (DataRow dr in dt.Rows) 33 { 34 int id = Convert.ToInt32(dr[0]); 35 string areaName=dr[1].ToString(); 36 //5.每增加一個節點 37 TreeNode tnode = treeNodeCollection.Add(areaName); 38 tnode.Tag = id; 39 //6.根據當前節點的Id,獲取該節點下的所有子節點 40 DataTable dtSub = GetDataByParentId(id); 41 //遞歸加載 42 LoadCity(tnode.Nodes,dtSub); 43 } 44 } 45 //2.寫個方法--根據父Id獲取數據的,為了方便我們這里使用DataTable,當然最好還是用list集合。 46 private DataTable GetDataByParentId(int pid) 47 { 48 DataTable dt = new DataTable(); 49 string sql = "Select AreaId,AreaName from TblArea where AreaPid=@pid"; 50 string constr = "Data Source=HY-PC;Initial Catalog=9月27新建數據庫;Integrated Security=True"; 51 //SqlDataAdapter內部有兩個參數--sql語句和連接字符串 52 using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr)) 53 { 54 //設置參數 55 adapter.SelectCommand.Parameters.Add(new SqlParameter("@pid",pid)); 56 //動態填充 57 adapter.Fill(dt); 58 return dt; 59 } 60 } 61 } 62 }
為什么這的遞歸沒有死循環呢?
foreach就是它的終結條件。
緊接着我們看下遞歸刪除:
十三、遞歸刪除
遞歸這塊,剛接觸可能會不太熟,多練幾次就熟啦。
作者近期文章列表:
C#基礎教程(完全免費,獻給代碼愛好者的最好禮物。注:本作者分享自己精心整理的C#基礎教程,無任何商業目的。 希望與更多的代碼愛好者交流心得,也請高手多多指點!!!) |
|
三層 | 三層(一) |
三層相關案例(及常見的錯誤) | |
三層實例(內涵Sql CRUD) | |
SQL數據庫 ADO.net | 數據庫的應用圖解一 |
數據庫的應用詳解二 | |
ADO.NET(內涵效率問題) | |
ADO.NET實例教學一 | |
面向過程,面向對象中高級 | 面向過程,面向對象的深入理解一 |
面向過程,面向對象的深入理解二 | |
面向對象的深入理解三 | |
winform基礎 | Winform基礎 |
winform中常用的控件 | |
面向過程 | 三種循環的比較 |
C#中的方法(上) | |
我們常見的數組 | |
面向對象 | 思想的轉變 |
C#中超級好用的類 | |
C#中析構函數和命名空間的妙用 | |
C#中超級好用的字符串 | |
C#中如何快速處理字符串 | |
值類型和引用類型及其它 | |
ArrayList和HashTable妙用一 | |
ArrayList和HashTable妙用二 | |
文件管理File類 | |
多態 | |
C#中其它一些問題的小節 | |
GDI+ | 這些年我收集的GDI+代碼 |
這些年我收集的GDI+代碼2 | |
HTML概述以及CSS | 你不能忽視的HTML語言 |
你不能忽視的HTML語言2精編篇 | |
你不能忽視的HTML語言3 | |
CSS基本相關內容--中秋特別奉獻 | |
CSS基本相關內容2 | |
JavaScript基礎 | JavaScript基礎一 |
jQuery | jQuery(內涵: jquery選擇器) |