一、遞歸算法
遞歸:你打開面前這扇門,看到屋里面還有一扇門。你走過去,發現手中的鑰匙還可以打開它,你推開門,發現里面還有一扇門,你繼續打開它。若干次之后,你打開面前的門后,發現只有一間屋子,沒有門了。然后,你開始原路返回,每走回一間屋子,你數一次,走到入口的時候,你可以回答出你到底用這你把鑰匙打開了幾扇門。
循環:你打開面前這扇門,看到屋里面還有一扇門。你走過去,發現手中的鑰匙還可以打開它,你推開門,發現里面還有一扇門(若前面兩扇門都一樣,那么這扇門和前兩扇門也一樣;如果第二扇門比第一扇門小,那么這扇門也比第二扇門小,你繼續打開這扇門,一直這樣繼續下去直到打開所有的門。但是,入口處的人始終等不到你回去告訴他答案。
1、定義:
在數學與計算機科學中,遞歸(Recursion)是指在函數的定義中使用函數自身的方法。實際上,遞歸,顧名思義,其包含了兩個意思:遞 和 歸,這正是遞歸思想的精華所在。
2、實例(斐波那契數列):1、1、2、3、5、8.......用遞歸算法求第30位數的值
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); // 相同重復邏輯,縮小問題的規模
}
二、冒泡法排序
1、定義:
就是將一個數組中的元素按照從大到小或者從小到大的排序進行排列。
2、實例:
int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = 0; j < nums.Length - 1 - i; j++)
{
if (nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
// 輸出
foreach (var num in nums)
{
Console.WriteLine(num);
}
3、只能針對數組做一個升序的排序
int[] nums = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
Array.Sort(nums);
4、對數組進行反轉
int[] nums = { 1, 4, 3, 6, 9, 8, 11 };
Array.Reverse(nums);
三、折半查找、二分算法
1、定義:
折半搜索,也稱二分查找算法、二分搜索,是一種在有序數組中查找某一特定元素的搜索算法。
要計算把目標值插入到該數組中的索引值。最開始的思路:
①.先把目標數插入到數組中
②.進行排序
③.返回索引
2、實例:
public static int process4(int[] arr, int low, int high, int key)
{
int mid = (low + high) / 2;
if (low > high)
return -1;
else
{
if (arr[mid] == key)
return mid;
else if (arr[mid] > key)
return process4(arr, low, mid - 1, key);
else
return process4(arr, mid + 1, high, key);
}
}