我对函数中return语句的理解是,返回后函数结束。 但是,当我试图理解递归函数的流程时,这是错误的:
public class Recursions {
int recursions(int i){
if(i==1){
System.out.println(i);
return 1;
}
else{
int j=(i*recursions(i-1));
System.out.println(j);
return j;
}
}
public static void main(String[] args) {
Recursions r=new Recursions();
r.recursions(4);
}
}
输出结果为:
1
2
6
24
但根据我的理解应该是:1 我没有理解输出,因为它建议在返回语句之后递归的情况下指针转到前一个调用?在此先感谢
答案 0 :(得分:2)
这种行为没什么奇怪的,这就是递归总是有效的方式。如果您在第一个println
之前添加if
语句:
int recursions(int i) {
System.out.println("------> calling recursions(" + i + ")");
if (i == 1) {
你得到这个输出:
------> calling recursions(4)
------> calling recursions(3)
------> calling recursions(2)
------> calling recursions(1)
1
2
6
24
因此,当您在recursions(4)
中致电main()
时,您会转到else
(因为i
是4)。所以我们得到:
i
* recursions(4-1)
进入recursions(3)
,i
(现在等于3)* recursions(2)
。
这反过来会让您进入recursions(2)
和i
(现在为2)* recursions(1)
。
recursion(1)
最终返回1,并且所有值都在堆栈中传播,并返回先前recursions
次调用的返回值。在每种情况下,就在return语句之前,您打印的是当前i
次调用的结果的recursions
次。
答案 1 :(得分:2)
区分方法(源代码中的方法)和方法调用(在运行时执行该方法)非常重要。 return语句结束当前的方法调用。
也就是说,方法调用表达式(例如recursions(i-1)
)由
因此,只要执行到达方法调用表达式,就会开始新的方法调用。一旦该方法调用终止,就恢复执行原始方法调用。
因此,您的计划将按如下方式执行:
begin invocation of recursive with i = 4
begin invocation of recursive with i = 3
begin invocation of recursive with i = 2
begin invocation of recursive with i = 1
print 1
return 1
invocation ends with return value 1
j = 2 * 1
print j
return j
invocation ends with return value 2
j = 3 * 2
print j
return j
invocation ends with return value 6
j = 4 * 6
print j
return j
invocation ends with return value 24
答案 2 :(得分:1)
每当你调用一个函数时,它会在堆栈中创建另一个框架,
F1,F2,F3,F4,
例如在F4中调用return时,F4将完成,但仍有其他的将保留。并且F3将使用返回值,它也会返回另一个值。它就像每个函数一样。
答案 3 :(得分:0)
返回后,功能结束
没有
返回后,该特定功能调用结束。返回仅从当前调用返回到方法。它将返回调用者,在这种情况下通常是对同一方法的另一个调用。
但是根据我的理解,它应该是:1我没有理解输出,因为它建议在返回语句之后递归的情况下指针转到前一个调用?
这正是发生的事情。 “之前”调用是对recursions
的外部调用。
这就是所谓的发生的事情。不只是在Java中。在支持递归方法/函数/过程/子例程调用的任何编程语言中。