returnn语句在递归函数调用中有不同的作用吗?

时间:2014-01-25 11:13:21

标签: java recursion return

我对函数中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 我没有理解输出,因为它建议在返回语句之后递归的情况下指针转到前一个调用?在此先感谢

4 个答案:

答案 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))由

评估
  1. 留出一点内存来保存此方法调用的数据(例如方法参数和局部变量的值)。对于技术上的人来说,这个内存区域称为堆栈帧,并且是当前线程堆栈的一部分)
  2. 评估参数表达式,并将其值分配给方法参数
  3. 执行方法的主体(直到我们到达方法体的末尾,或者返回语句。在后一种情况下,将返回值保留在某处)
  4. 释放为方法调用留出的内存
  5. 方法调用表达式的值是在步骤3中计算的返回值
  6. 因此,只要执行到达方法调用表达式,就会开始新的方法调用。一旦该方法调用终止,就恢复执行原始方法调用。

    因此,您的计划将按如下方式执行:

    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中。在支持递归方法/函数/过程/子例程调用的任何编程语言中。