关于java1到4求和递归的理解
关于java入门递归的问题详细解答,让你一看就明白
1.要知道static变量是不用创建对象就可以调用的,是这个类所有,由该类创建的所有对象共享同一个 static 属性,我们这里只设置一个类java。
2.递归自己调用自己会出现一个循环造成栈的溢出,得加个条件,当然也有一些递归太深也会出错,平时我们入门级别也不会碰到。
3.要理解return 语句的作用。return 值;是讲值返回给谁,就要看谁去调用它。
4. return;就是代表一个结束的意思。
5.递归就是一个方法体中调用自己,不是调用别人,也不是俩个方法体互调
理解 return 1和return n + sum(n - 1);
这里比较难理解的是return 1和return n + sum(n - 1);它们俩个其实返回给谁就要看是谁调用了它。
int retValue = sum(n);这里很多人都会理解成赋值,其实在这里并不是赋值的意思,而是一个方法的调用也有赋值的意思。
看到这里就有有人疑问,为什么在这里是方法的调用吗?不应该是创建个对象在调用吗?是的,这里我们是有static,static是静态方法,我们这里的static是指“public static int sum(int n)”
这个方法,不是“public static void main(String[] args)”,这个是主方法,不是我们定义的静态方法。static可以不创建对象直接访问是没有问题的。好了,我们现在明白了这道题中有俩个方法分别是
int retValue = sum(n); 中的sum(n)
return n + sum(n - 1);中的sum(n-1)
我们先看return 1,return 1,是一个return 返回值,告诉谁调用它,就返回给谁,我们可以看到下面的return n + sum(n - 1);中有一个sum(n-1);的一个方法,这个方法会调用return
1,当执行到sum(2)时,其中2的值会赋值给sum(n-1)中,就是是sum(1),sum(1)会在if里面中的n等于1进行判断,结果等于1时,递归结束了,它就返回一个常量,所以sum(1)就变成了1。
我们对return 1搞明白了,现在看return n + sum(n - 1);
我们在执行的时候,return n+sum(n-1)时“return n+”这个东西并不会执行,只有在最后的过程才会执行,那个时候递归已经结束了,我们看这个"sum(n-1)";这个sum(n-1)也是个方法,
这个方法是用来调用return 1的 ,也是传值用的。return n+sum(n-1),这时递归没有结束时,我们只会调用return
中的sum(n-1)而不会调用“n+”。只有在结束的时候,我们就会调用,把它们进行累加。好了我们差不多搞明白return 1和
return n+sum(n-1)的意思了。
4. return;就是代表一个结束的意思。
5.递归就是一个方法体中调用自己,不是调用别人,也不是俩个方法体互调
我们现在走一下流程
流程
- 第一步:总的运行是这样的:首先static是一个静态变量,我们开始从main方法开始运行,首先我们把值赋值给int n,
- 那么int n 就是4;
- 调用sum(n)的方法,然后赋值给retValue, 然后在打印输出。
- 第二步:我们在“public static int sum(int n)”定义一个sum(int n)的一一个静态方法。
- 如果if等于1, 就执行里面的return 1,把里面的return 1的值,返回给下面的return n +sum(n-1)的sum(n-1)中。
条件成立就会不在递归,我们会把“return n +sum(n-1)”
返回给int retValue = sum(n);最终打印输出。 - 这里很多人都会有个疑惑:不是说return 值;中只要看它返回给谁,就要看它调用给谁的吗?
*应该是把return 1调用给 int retValue = sum(n);才对啊。是的,调用的时候要看返回值
*但是这里,我们在return 1时下面有一个sum(n-1)的这样一个方法,会先调给sum(n-1)然后return 就会把 n +sum(n-1),把之前的sum里的值全加起来,最终结果会将这条语句返回给int retValue = sum(n),最后打印输出,结果为10。
详细介绍
首先先我定义的是个数值4,数值4,并不是1到4的几个数,就是很普通的数值4。把4放进“int retValue = sum(n);”去,sum(4)赋值给了int retValue ,但是它不会打印,因为sum(n)是个调用方法,方法里面的东西还没有执行,只有执行完毕才行。sum(4)中把4传参给了 public static int sum(int n) 中的(int n),所以n就变成了4,我们首先4显然不符合if 里面的,不执行renturn 1,往下走
* 执行return n + sum(n - 1);这个语句,然后 return 4 +sum(3),返回给
* int retValue = sum(n);这个语句,先不打印,这个值还是在里面,是因为递归没有结束,
* 就像是进入一个循环,然后有一个条件才能跳出,在打印。接着执行
* public static int sum(int n) ;这条语句,也就是方法sum(int n)中的数就变成了
* sum(int 3),往下走不执行if语句,执行 return n + sum(n - 1);
* 也就是return 3 +sum(2);然后在返回给int retValue = sum(n)语句,这时sum(2)了,2在if里不成立,接着走,
* return 2+sum(1),这时sum(1)了
* 要注意了sum里的值是1,我们接着走方法sum(int n) 这时,sum中的1执行if语句,
* return 1,这是return 1就把1调用了给sum(1),所以sum(1)就变成1了。
* 这时只是递归结束了,那么这个“return n+”就会执行了,把return
* 就把之前n等于4,就会把前面的sum(3)加起来,里面的sum(3)
* 就是sum(2)和sum(1),这里sum(1)是数值1,就是
* 4+sum(3)相当于 4+3+2+1就是10,然后int retValue = sum(n);调用,输出这结果。系统首先不会先加4+sum(3) 这样处理,它只会先加之前的值,之前是sum(1) sum(2) sum(3) sum(4)。
* 这里没有涉及到这个倒序的问题,只是简单说了下思路,请看递归说明部分就会有所理解。
代码如下
public class java {
public static void main(String[] args) {
int n = 4;// 把4赋值给n
int retValue = sum(n);
/*
* 把sum的数赋值给了retaVlue,这里就是调用了 sum方法,
* 每次调用就会重新赋值。如n中的数是4,那么n中的数只是代表这个数只是4而已,
* 把这个数给retValue,然后在打印输出,只有递归结束的时候,return n + sum(n - 1);返回给了它才能打印。
*/
System.out.println(retValue);
}
public static int sum(int n) {//定义了一个静态方法,将int n的数为形参,传值用的。
if (n == 1) {/*如果n等于1的话,那么就执行return 1,
这个return 1是给下面的sum(n - 1);让sum(n-1)变成了1 */
return 1;
}
return n + sum(n - 1);//这个return 是在递归结束后返回给并且累加int retValue = sum(n);
}
}
接入如下:
对递归说明
return n+sum(n-1);
4+sum(3),sum(3)就是3+sum(2);
sum(2)就是2+1,最后sum(1)就是1。
这个return 4+sum(3)是怎么来的?
我来说明一下:这个return 4+sum(3),我们先看
sum(3),return n+sum(n-1)这个语句,只有sum(3)执行的后的时候,才进行加上return 4。这里n是3,接着sum(3-1)就是sum(2),然后3+sum(2); sum(2)会返回给return n+
sum(2-1),就会变成sum(1),这里的n是2,就是return 2+sum(1)以此类推。到了
return 1时,就是递归就结束了,返回给sum(n-1)中,我们的“return n+”,才会执行,然后在返回给sum(n-1)中,然后在返回给“return n+”以此类推,这是1会返回给return n+sum(1-n)中,这里sum(1-n)就变成了1,就是return 1,就会返回给sum(2)里,sum(2)就会return 2+sum(1),在返回给sum(3)中,然后就是return 3+sum(2),到了sum(4)中,
return 4+sum(3);
最后就是4+3+2+1等于10,它只有把前面的全部算完在返回给
sum(n);而不是逐个返回给sum(n),然后sum(n)调用的方法在赋值给int retValue,
最后打印输出。
它这个要注意的问题就是return 返回值给谁?
谁调用的问题?然后就是递归结束后怎么给计算的问题?
调用的方法是谁?把这些问题搞明白了,这道题就差不多了。
本文地址:https://blog.csdn.net/weixin_46483087/article/details/109559869