Java 参数调用递归

Java 参数调用递归,java,recursion,Java,Recursion,我尝试使用递归搜索文件夹中的所有文件及其子文件。但是我想添加缩进以使输出更加美观。我在函数的变量中添加了一个int变量,以指示需要多少缩进。这是成功的最终代码 public void seekFile(File file, int tab) { File [] files=file.listFiles(); assert files != null; for (File file1 : files) { if (file1.isFile()){

我尝试使用递归搜索文件夹中的所有文件及其子文件。但是我想添加缩进以使输出更加美观。我在函数的变量中添加了一个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);
        }
    }
}
public void seekFile(文件,int选项卡){
File[]files=File.listFiles();
断言文件!=null;
用于(文件1:文件){
if(file1.isFile()){
对于(int i=0;i

起初,我使用
seekFile(file1,++tab)
进行递归,但我得到的缩进完全错误,在我调出
选项卡后,输出是准确的。为什么会这样?

++tab
做两件事:

  • 计算结果为“比
    选项卡的值多1个”
  • 选项卡的值更改为上述值
(,但为了理解问题中的代码,仅这两个就足够了)

tab+1
做了一件事:

  • 计算结果为“比
    选项卡的值多1个”
tab+1
不会更改
tab
的值

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

如果您使用
++tab
,并且遇到一个目录,
tab
将递增,之后的每个同级文件/目录的缩进量将超过其应有的缩进量

如果使用
选项卡+1
,则当前呼叫的
选项卡不会更改


在这两种情况下,“比
选项卡
”的值多1”的值传递给下一个递归调用
seekFile
,并创建一个新的堆栈帧并推送到调用堆栈上。每个堆栈帧都有自己的
tab
变量,这就是为什么将
tab+1
传递给新调用不会影响当前调用中的
tab
变量的原因。

++tab
做两件事:

  • 计算结果为“比
    选项卡的值多1个”
  • 选项卡的值更改为上述值
(,但为了理解问题中的代码,仅这两个就足够了)

tab+1
做了一件事:

  • 计算结果为“比
    选项卡的值多1个”
tab+1
不会更改
tab
的值

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

如果您使用
++tab
,并且遇到一个目录,
tab
将递增,之后的每个同级文件/目录的缩进量将超过其应有的缩进量

如果使用
选项卡+1
,则当前呼叫的
选项卡不会更改


在这两种情况下,“比
选项卡
”的值多1”的值传递给下一个递归调用
seekFile
,并创建一个新的堆栈帧并推送到调用堆栈上。每个堆栈帧都有自己的
tab
变量,这就是为什么将
tab+1
传递给新调用不会影响当前调用中的
tab
变量。

您理解
++tab
tab+1
之间的区别吗?可能是地址问题?我会查出来的。你明白
++tab
tab+1
之间的区别吗?也许是地址问题?我会知道的。