C#遞歸算法和排列算法
一、遞歸算法
遞歸:你打開(kāi)面前這扇門(mén),看到屋里面還有一扇門(mén)。你走過(guò)去,發(fā)現(xiàn)手中的鑰匙還可以打開(kāi)它,你推開(kāi)門(mén),發(fā)現(xiàn)里面還有一扇門(mén),你繼續(xù)打開(kāi)它。若干次之后,你打開(kāi)面前的門(mén)后,發(fā)現(xiàn)只有一間屋子,沒(méi)有門(mén)了。然后,你開(kāi)始原路返回,每走回一間屋子,你數(shù)一次,走到入口的時(shí)候,你可以回答出你到底用這你把鑰匙打開(kāi)了幾扇門(mén)。
循環(huán):你打開(kāi)面前這扇門(mén),看到屋里面還有一扇門(mén)。你走過(guò)去,發(fā)現(xiàn)手中的鑰匙還可以打開(kāi)它,你推開(kāi)門(mén),發(fā)現(xiàn)里面還有一扇門(mén)(若前面兩扇門(mén)都一樣,那么這扇門(mén)和前兩扇門(mén)也一樣;如果第二扇門(mén)比第一扇門(mén)小,那么這扇門(mén)也比第二扇門(mén)小,你繼續(xù)打開(kāi)這扇門(mén),一直這樣繼續(xù)下去直到打開(kāi)所有的門(mén)。但是,入口處的人始終等不到你回去告訴他答案。
1、定義:
在數(shù)學(xué)與計(jì)算機(jī)科學(xué)中,遞歸(Recursion)是指在函數(shù)的定義中使用函數(shù)自身的方法。實(shí)際上,遞歸,顧名思義,其包含了兩個(gè)意思:遞 和 歸,這正是遞歸思想的精華所在。
2、實(shí)例:
static void Main(string[] args) { int[] sum = new int[30]; for (int i = 0; i < sum.Length; i++) { sum[i] = process1(i); Console.WriteLine(sum[i]); } } public static int process1(int a) { if (a == 0 || a == 1) return 1; return process1(a - 1) + process1(a - 2); }
3、階乘算法:
public static int process2(int n) { if (n == 1) return 1; return n * process2(n - 1); // 相同重復(fù)邏輯,縮小問(wèn)題的規(guī)模 }
二、排列算法
輸出任意個(gè)字母和數(shù)字的全排列
對(duì)于一個(gè)長(zhǎng)度為n的串或者n個(gè)字符(數(shù)字、節(jié)點(diǎn))組成的字符串?dāng)?shù)組,它的全排列共有A(n, n)=n!種。這個(gè)問(wèn)題也是一個(gè)遞歸的問(wèn)題。如1,2,3,全排列可得到:{123,132,213,231,312,321}。
用遞歸算法實(shí)現(xiàn)代碼如下:
public static void Permutation(string[] nums, int m, int n) { string t; if (m < n - 1) { Permutation(nums, m + 1, n); for (int i = m + 1; i < n; i++) { //可抽取Swap方法 t = nums[m]; nums[m] = nums[i]; nums[i] = t; Permutation(nums, m + 1, n); //可抽取Swap方法 t = nums[m]; nums[m] = nums[i]; nums[i] = t; } } else { #region 存放到List Node root = null; Node currentNode; for (int j = 0; j < nums.Length; j++) { currentNode = new Node(nums[j]); currentNode.nextNode = root; root = currentNode; } NodeList.Add(root); #endregion #region 打印控制臺(tái) for (int j = 0; j < nums.Length; j++) { Console.Write(nums[j]); } Console.WriteLine(); #endregion } }
調(diào)用算法:
static void Main(string[] args) { Nums = new string[] { "a", "b", "c" }; Permutation(Nums, 0, Nums.Length); Console.ReadKey(); }
到此這篇關(guān)于C#算法之遞歸和排列的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#/VB.NET實(shí)現(xiàn)在Word文檔中添加頁(yè)眉和頁(yè)腳
頁(yè)眉位于文檔中每個(gè)頁(yè)面的頂部區(qū)域,常用于顯示文檔的附加信息;頁(yè)腳位于文檔中每個(gè)頁(yè)面的底部的區(qū)域,常用于顯示文檔的附加信息。今天這篇文章就將為大家展示如何以編程的方式在在?Word?文檔中添加頁(yè)眉和頁(yè)腳2023-03-03C#中使用基數(shù)排序算法對(duì)字符串進(jìn)行排序的示例
Radix Sort基數(shù)排序是非比較型的排序算法,其時(shí)間復(fù)雜度是O(k·n),n為元素個(gè)數(shù),為數(shù)字位數(shù),這里我們就來(lái)看一下C#中使用基數(shù)排序算法堆字符串進(jìn)行排序的示例2016-06-06C# Onnx實(shí)現(xiàn)DIS高精度圖像二類分割
這篇文章主要為大家詳細(xì)介紹了C# Onnx實(shí)現(xiàn)DIS高精度圖像二類分割的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11C#使用委托實(shí)現(xiàn)的快速排序算法實(shí)例
這篇文章主要介紹了C#使用委托實(shí)現(xiàn)的快速排序算法,實(shí)例分析了C#委托機(jī)制與快速排序算法的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-07-07