遞歸


遞歸

先來看下treeview的簡單應用:

                       

一、nodes

 

二、往節點里面添加內容

下面再給大家復習下遞歸

什么叫遞歸呢?“和尚講故事”,就是方法自己調自己,這就是遞歸。

 

三、方法自己調自己

我們先調下T1方法,讓大家看個東西:

 

四、讓大家看的東西

 

五、調用堆棧

    用堆棧來監視一下:

一開始調了main方法

再調T1方法

再調T2方法

注意一下順序,類似於棧結構,先進來在最下面,后進來在最上面。

剛T2方法執行完畢,T2方法沒了。

調完之后,從棧里面出來了。

 

再看下我調Say方法。

一開始還是調的main方法,

一直在調Say方法,這個棧越來愈大,直到系統報錯。

 

六、溢出,系統報錯

  遞歸里面注意的地方:一定要有終止條件。

  接下來我們看兩個例子:

 

七、這個方法的執行結果是什么呢?

如果代碼中加上:index++; 又是什么答案呢?

不讓用VS測試的時候,自己可以在紙上用紙和筆划一下。

有一些個公司喜歡用這種裝逼的題目當面試題的。

答案是4a4b,為什么是這樣呢?

我們畫圖進行分析:

 

八、例一分析圖示

對於初學者來講,這幅圖可能還是比較的抽象,所以,建議調試一下。

 

九、例一分析圖示二

 

十、例二代碼

大家再想想,這段代碼的輸出結果。考驗人類思維極限呦。

下面我們還是畫個圖就行演示:

 

十一、例二分析圖

n在自己的作用域范圍內,互不影響。

在做一個程序的時候,能用循環做的,就不要用遞歸來做。用遞歸的話,效率極其低下。

想深入研究的朋友可以看下關於:尾遞歸優化的問題。

在上面兩個題目中遞歸因為棧,才能記住,執行完后面調的方法之后返回去調沒有執行完的方法里面的語句。

下面我們看下遞歸加載和遞歸刪除:

 

十二、TreeView控件的基本使用

點擊按鈕加載表中數據到TreeView上。

遞歸加載子節點插入代碼位置:

View Code
 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選擇器)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM