【问题标题】:Parameters on call recursion调用递归的参数
【发布时间】:2021-01-12 11:18:24
【问题描述】:

我正在尝试使用递归来搜索文件夹中的所有文件及其子文件。但我想添加缩进以使输出更漂亮。我在函数的变量中添加了一个int变量来表示需要多少个缩进。这是成功的最终代码。

public void seekFile(File file, int tab) {
    File [] files=file.listFiles();
    assert files != null;
    for (File file1 : files) {
        if (file1.isFile()){
            for(int i = 0; i< tab; i++)
                System.out.print("|\t");
            System.out.println(file1.getName());
        }else {
            for(int i = 0; i< tab; i++)
                System.out.print("|\t");
            System.out.println(file1.getName());
            int index = tab+1;
            seekFile(file1,index);
        }
    }
}

一开始我用seekFile(file1, ++tab)做递归,但是得到的缩进全错了,换掉tab后输出是准确的。这是为什么呢?

【问题讨论】:

  • 你了解++tabtab + 1的区别吗?
  • 可能是地址问题?我会找出答案的。

标签: java recursion


【解决方案1】:

++tab 做了两件事:

  • 评估为“比'tab'的值多1”的值
  • tab的值更改为上述值

(It actually does a lot more things,但为了理解问题中的代码,就这两个就足够了)

tab + 1 做一件事:

  • 计算结果为“比'tab'的值大1”

tab + 1 不会改变tab 的值。

这是至关重要的,因为您不希望 tab 在每次递归调用中发生变化。 for (File file1 : files) 循环的每次迭代都应该使用相同的tab,因为每次迭代都会在同一目录中打印出一个文件/目录。只有当您拨打seekFile 时,您才会使用更高的tab 号码。

如果您使用++tab,并且遇到一个目录,tab 将递增,之后的每个兄弟文件/目录都会有更多的缩进。

如果您使用tab + 1,则当前呼叫的tab 不会改变。

在这两种情况下,“1 大于'tab'的值”的值被传递给seekFile 的下一个递归调用,并创建一个新的堆栈帧并将其压入调用堆栈。每个堆栈帧都有自己的tab 变量,这就是为什么将tab + 1 传递给新调用不会影响当前调用中的tab 变量。

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2018-01-30
    • 1970-01-01
    • 2011-01-13
    • 2021-12-20
    • 2012-01-04
    • 1970-01-01
    • 2017-10-05
    • 2012-08-29
    相关资源
    最近更新 更多