二维数组
- 二维数组遍历
try {
int sd[][]=new int[8][7];
for(int i=0;i<7;i++){
sd[0][i]=1;
sd[7][i]=1;
}
for(int i=0;i<8;i++){
sd[i][0]=1;
sd[i][6]=1;
}
for(int i=0;i<8;i++){
for(int k=0;k<sd[i].length;k++){
System.out.print(sd[i][k]+" ");
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
杨辉三角
/*杨辉三角*/
int[][] yanghui = new int[10][];
for (int i = 0; i < yanghui.length; i++) {
/*yanghui[i]是一个地址,指向第i个元素,第i个元素是一维数组,给一维数组分配大小new*/
yanghui[i] = new int[i + 1];/*只需要明白,当只写一个[]时是在表示某个某个二维数组中元素的长度,即声明一维数组的长度*/
for (int k = 0; k < yanghui[i].length; k++) {
if(k==0||k== yanghui[i].length-1)
{
yanghui[i][k]=1;
}else
{
yanghui[i][k] = yanghui[i - 1][k - 1] + yanghui[i - 1][k];
}
}
}
for (int i = 0; i < yanghui.length; i++){
for (int k = 0; k < yanghui[i].length; k++){
System.out.print(yanghui[i][k]+" ");
}
System.out.println();
}
- 给二维数组动态分配元素大小。
int[][] yanghui = new int[10][];
for (int i = 0; i < yanghui.length; i++) {
/*yanghui[i]是一个地址,指向第i个元素,第i个元素是一维数组,给一维数组分配大小new*/
yanghui[i] = new int[i + 1];/*只需要明白,当只写一个[]时是在表示某个某个二维数组中元素的长度,即声明一维数组的长度*/
for (int k = 0; k < yanghui[i].length; k++) {
if(k==0||k== yanghui[i].length-1)
{
yanghui[i][k]=1;
}else
{
yanghui[i][k] = yanghui[i - 1][k - 1] + yanghui[i - 1][k];
}
}
}
上面的二维数组yanghui是一个元素个数固定,但是元素内的元素个数不固定的二维数组,我们要往里面写值,yanghui[0]={1,2},yanghui[1]={1,2,3,4},表示二维数组第0个位置有2个元素,第1个位置有4个元素。因此我们使用
yanghui[i]=new int[长度] 来添加到数组中。
- 二维数组其实就是一个”一维数组“,只不过是元素由单个元素变成了数组元素,后面的[]控制数组元素的长度而已。
- yanghui[i] = new int[i + 1]; 即数组的长度随下标的变化而变化
for循环的例子
- 给定一个由小到大的数组,现在输入一个数字,并添加到数组中,输入后数组仍然由小到大排序。
public static int[] Arr(int[] arr, int num) {
int newarr[] = new int[arr.length + 1];
int flag = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= num) {/*num小于某个数 才会在该数的位置替换*/
flag = i;/*将这个位置添加到新数组中*/
break;
}
}
if (flag==-1){
flag=arr.length;
}
//这里flag=2 num=45
for (int i = 0, j = 0; i < newarr.length; i++) {
if (i != flag) {/*还没到那个位置 继续交换*/
newarr[i] = arr[j];
j++;
} else {/*到了交换位置*/
newarr[i] = num;
}
}
return newarr;
}
这里用到了一种算法思想,即标识符,由标记符来当前坐标下的值或者由标记符的值的变化来判断是否跳出循环等等。
- 定义一个标志,常用于寻找某个数,寻找某个最值的坐标,向数组中插入某个数,删除数组中的某个数。
寻求最值
int max=num[0];
int index=0;
for(int i=1;i<10;i++){
if(max<num[i]){
max=num[i];
index=i;
}
}
System.out.println("最大值为:"+max+"它的坐标为"+index+1);
最小值只需要改max>num[i]即可
成员方法的传参机制
-
*结论:*基本数据类型传递的是值,形参的改变不影响实参。
-
基本数据类型:
-
引用数据类型: 数组、String、Object、Void、接口interface引用
-
区别:引用数据类型的首字母都是大写
-
方法传递机制hsp-P211-P213
方法递归机制
- 知识点:栈执行完后会返回
- 栈递归的时候,是层层堆积的,直到不满足条件,才开始从最后一次往前出,重点:这里的前提是不满足条件后才开始往返进行,因此此时已经不再条件里了,代码都开始向来时的方向执行了。
- 在解释一下:递归是层层堆积的,当递归条件不满足时,停止递归,比如说你n=4的时候递归开始,且执行到n=2的时候不满足了,此时算是从n=4开始的递归就结束了,但是系统此时应该是先把n=2的之后操作执行完之后,才开始向回推进,等到n=2的栈执行完后,往返执行的时候,n=3,n=4是要进行下一步操作了,而不是还在循环里面。 - 上面的我理解错了,应该是这个样子的,递归是层层堆积的,递归开始的地方,是当前代码执行完毕的地方,但是系统还是要向下(继续递归)继续执行代码,直到不满足条件递归结束为止,在递归结束的地方,系统开始执行,结束代码的后面的所有代码直到执行完,才开始向回执行。
- 当递归到达最后一层的时候,不符合条件递归结束,会执行该栈的所有代码,之后在执行之前的栈,执行完之前的栈的代码后,在执行之前的之前的…
public class DiGui {
public static void main(String[] args) {
DiGui1 d=new DiGui1();
d.test(5);
}
}
class DiGui1{
public void test(int n){
// 5 test(4)
// 4 test(3)
// 3 test(2)
// 2 跳出if 输出
if(n>2){
test(n-1);
}
System.out.println("n="+n);
}
}
- 阶乘问题-递归算法
**其实递归你也可以这么理解,把递归拆分来看,比如上面这里
n=5的时候,进入f(5-1)*5,f(5-1)-> f(4-1)4,f(4-1)->f(3-1)3…
f(1-1)1…就是 1x2x3x4x5。
使用递归的5个重要规则
- 斐波那契数列
- 猴子吃桃
题目:猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?
/* day10 taozi:1
* day9 taozi:后一天的桃子=前一天的桃子/2 - 1
* 输入day,求第day天的时候有多少桃子
* */
public int peach(int day) {
if (day == 10) {
return 1;
} else if (day >= 1 && day <= 9) {
return (peach(day + 1) + 1) * 2;
} else {
return -1;
}
今天学习了二维数组以及递归还有参数传递的知识,感觉学的不是很扎实,晚点找点力扣题练习一下,明天继续学习递归。