一、递归
- 方法内部又调用自身的过程;
- 核心思想:将问题转移给范围缩小的子问题;
- 适用性:在解决问题过程中,又遇到相同问题;
- 优势:将复杂的问题简单化;
- 缺点:性能较差(cpu占用过多)
- 注意:存在堆栈溢出
二、一维数组
- 从Array类派生的,一组数据类型相同的变量组合;
- 一种空间连续的数据结构;
- 元素通过索引(位置的序号)进行操作。
1、定义数组
- 声明数组
数据类型[ ]
?
~
?数组名 - 初始化数组
数组名 = new
?
~
? 数据类型[元素总数];
2、初始化数组
1>初始化
- 初始化的元素类型与声明时的类型必须相同。
- 数组初始化后,内存中存储该数据类型的默认值:
–整型为 0 –非整型为 0.0 –char为 \0 –string为 null –bool为 false
2>初始化 + 赋值
- 可以再数组初始化的同时对元素进行赋值;
- 语法:
数据类型[ ] 数组名 = new
?
~
? 数据类型[ ]{元素1,元素2…}; 例如: int[] array01 = new int[] {1,2,3,4,5}; - 初始化时[ ]内也可以填入数组长度,但必须与所赋值的元素总数一致。
3>声明 + 赋值
- 可以在数组声明的同时对元素进行赋值;
- 语法:
数据类型[ ] 数组名 = {元素1,元素2…}; 例如: int[] array01 = {1,2,3,4,5}; - 元素的个数即为数组长度;
- 程序员可以省略初始化,但编译器内部仍然会"new 数据类型[]";
- 不支持以下写法:
double[] array03; array03 = {1.0,2.0};
3、访问数组元素
1>通过索引访问
- 可以通过数组的索引(位置的序号)进行读写操作;
- 语法:
数组名[索引] 例如: string[] array = new string[]{“a”,“b”,“c”}; Console.WriteLine(array[0]);–获取数组第一个元素
2>通过for遍历
- 遍历:按照某种顺序访问每一个元素;
- for 循环遍历数组元素,正序输出到控制台中:
string[] array = new string[]{“a”,“b”,“c”}; for (int i=0;i<array.Length;i++) {
??????
~~~~~~
??????Console.WriteLine(array[i]); } - for 循环遍历数组元素,倒序输出到控制台中:
string[] array = new string[]{“a”,“b”,“c”}; for (int i=array.Length -1 ;i<=0 ;i --) {
??????
~~~~~~
??????Console.WriteLine(array[i]); }
3>通过foreach遍历
- foreach 是一种更简单那更明了的读取数组元素的语句;
- 局限性:
1.只能读取全部元素(语句本身) 2.不能修改元素 3.只能遍历实现Ienumberable接口的集合对象 - 语法:
foreach(元素类型
?
~
? 变量名
?
~
? in
?
~
? 数组名) {
??????
~~~~~~
??????变量名表示数组中的每个元素 }
4、Params关键字
- 如果有一个参数为数组类型的方法,使用params关键字能使传入方法的参数数量可变,从而不必显式声明数组的大小,但参数的类型必须一致;
- 如果使用params关键字,那么就可以使用数组作为参数;
- 一个方法只能使用一个params关键字,并且params关键字只能修饰方法的最后一个参数;
using System;
namespace Day05
{
class Program
{
private static int Add(params int[] array)
{
int sum = 0;
foreach (var item in array)
{
sum += item;
}
return sum;
}
static void Main()
{
int result01 = Add(new int[] {1,3,5,787,45 });
int result02 = Add(1, 3, 4, 56, 78);
int result03 = Add();
}
}
}
5、常用方法及属性
- 数组长度:数组名.Length
清除元素值:Array.Clear 复制元素:Array.copy
???????
~~~~~~~
??????? 数组名.CopyTo 克隆:数组名.Clone 查找元素:Array.IndesOf
???????
~~~~~~~
???????Array.LastIndexOf 排序:Array.Sort 反转:Array.Reverse
三、多维数组
1、矩形数组
- 具有两个或多个索引的数组
- 语法:
–声明 + 初始化 数据类型[ , ]
?
~
? 数组名 = new
?
~
? 数据类型[行数,列数]; – 初始化 + 赋值 数组名 = new 数据类型[ , ]{{元素1,元素2…},{元素3,元素4…}}; –读写元素 数组名[行索引,列索引] - for循环遍历数组元素,以表格形式输出到控制台中:
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.Write(array[i,j] + "\t");
}
Console.WriteLine();
}
2、锯齿数组(交错数组)
- 数组中各行的大小可以不同;
- 创建锯齿数组的时候,必须声明数组的行数。保存在每一行中的数组必须被分别创建,然后才可以为这些数组中的数组的元素赋值。
- 语法:
–声明 + 初始化 数据类型[ ][ ]
?
~
?数组名 = new
?
~
? 数据类型[行数] [ ];
using System;
namespace Day05
{
class Program
{
static void Main(string[] args)
{
int[][] array;
array = new int[4][];
array[0] = new int[3];
array[1] = new int[5];
array[2] = new int[4];
array[3] = new int[1];
array[0][0] = 1;
array[1][2] = 2;
array[2][1] = 4;
foreach (int[] item in array)
{
foreach (int element in item)
{
Console.WriteLine(element);
}
}
for (int i = 0; i < array.Length; i++)
{
for (int j = 0; j < array[i].Length; j++)
{
Console.Write(array[i][j] + "\t");
}
Console.WriteLine();
}
}
}
}
四、小结
- 数组是一个可以通过索引访问的对象集合,存储的对象就有相同的类型;
- 可以使用for循环遍历数组,使用循环次数的计数器作为访问数组的索引值;
- 使用foreach遍历数组(或其他集合)不需要记录索引值;
- 创建数组的同时可以初始化数组,方法是将初始值写在大括号{ }中;
- params关键字可以在调用方法时传递数量不定的参数,这些参数的类型必须一致,方法将这些参数作为一个数组来对待;
- Array类包含一些方法,通过他们可以对数组进行搜索、排序等操作。
- 矩形数组是一个多维的数组,而锯齿数组是数组的数组。
|