递归方法内部变量的疑问,为什么num变量归零了不起作用?

题目描述

写一个查找某个文件夹中,java文件的个数的方法中,使用了递归.但是我有一个疑问,请看代码.
之前我完成这个需求,是中方法外定义一个变量初始值为0,看了别人的代码才发现下面这样写才是正确的,但是玩不明白,为什么方法里面的变量,再每次递归的时候都已经重新归0了,最好还能得到正确结果.求教大佬,帮我解答.

相关代码

public static void main(String[] args) {
        File file = new File("day_08");
        System.out.println(method(file));
    }
public static int method(File file) {
        int num = 0;
        System.out.println("...每次递归都会执行num=0,为什么结果还是正确的?...");
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                num += method(f);
            }
            if (f.toString().endsWith(".java")) {
                num++;
                System.out.println(f);
            }
        }
        return num;
    }

输出结果

...每次递归都会执行num=0,为什么结果还是正确的?...
...每次递归都会执行num=0,为什么结果还是正确的?...
...每次递归都会执行num=0,为什么结果还是正确的?...
...每次递归都会执行num=0,为什么结果还是正确的?...
day_08\src\demo1\Demo.java
...每次递归都会执行num=0,为什么结果还是正确的?...
day_08\src\demo1\demo1_1\Demo.java
day_08\src\demo1\demo1_1\ThreadDemo.java
day_08\src\demo1\demo1_1\Thread_1.java
day_08\src\demo1\demo1_1\Thread_2.java
day_08\src\demo1\demo1_1\Thread_3.java
day_08\src\demo1\ThreadDemo.java
...每次递归都会执行num=0,为什么结果还是正确的?...
day_08\src\demo2\FileDemo.java
day_08\src\demo2\FileDemo2.java
...每次递归都会执行num=0,为什么结果还是正确的?...
day_08\src\demo3\DiGUiDemo.java
day_08\src\demo3\DiGuiDemo2.java
day_08\src\demo3\DiGuiDemo3.java
...每次递归都会执行num=0,为什么结果还是正确的?...
day_08\src\demo4\demo.java
day_08\src\demo4\demo2.java
14

文件目录结构

图片描述

阅读 3.8k
4 个回答

因为num是局部变量... 每次递归的都不是同一个num。

num += method(f); 你的递归是这个语句。最后一个递归的执行结果会返回给上一个递归,层层传递,最终会返回给第一个调用方法,所以程序返回的结果是最终累加的结果,所以最后的结果是正确的。

数数有2种方法,
1.直接累加,(第一个文件夹)1,2,3,(第2个文件夹)4,5,6...;
int num = 0;写在method外面
2.分别数再累计,sum1 = (第一个文件夹)1,2,3;sum2 = (第2个文件夹)1,2,3。总数就是sum1 + sum2。;
int num = 0;写在method里面。
你的代码用的是第二种方法

每次递归,你都可以把自己想象成一个文件夹,你的任务就是把你内部所有的java文件个数统计好告诉你的上级。此时你要统计内部所有的文件,你是不是要从0开始算。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题