Java 参数调用递归
我尝试使用递归搜索文件夹中的所有文件及其子文件。但是我想添加缩进以使输出更加美观。我在函数的变量中添加了一个int变量,以指示需要多少缩进。这是成功的最终代码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()){
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
之间的区别吗?也许是地址问题?我会知道的。