给定此函数:
pretty_print(Folders, Depth) ->
{CurrrentFolder, ListSubfolders} = Folders,
SignTemp = lists:duplicate(Depth, "-"),
case Depth of
0 -> Sign = SignTemp;
_ -> Sign = "|" ++ SignTemp
end,
io:format("~s~s~n", [Sign, CurrrentFolder]),
[pretty_print(Subfolder, Depth+1)|| Subfolder <- ListSubfolders].
当在列表解析中生成器为null或空时,Erlang中的递归函数会发生什么?
所以当变量为空时,函数不会调用自身?
那行不会出错吗?没有什么可以控制的,这行不会出错吗?
{CurrrentFolder, ListSubfolders} = Folders,
例如,在这段代码中,通过Depth控制另一个变量的行为:
case Depth of
0 -> Sign = SignTemp;
_ -> Sign = "|" ++ SignTemp
end,
有件事我不太明白。
当函数到达目录的最后一个文件夹时会发生什么情况?
4条答案
按热度按时间ni65a41a1#
当Elrang中的递归函数在列表解析中生成器为null或空时会发生什么?
当列表解析中的生成器为空时,则该解析也为空。不管它是否递归。
所以当变量为空时,函数不会调用自身?
是的,我知道
没有什么可以控制的,这一行不发生错误?
不,它只是假设调用者将给出一个与之匹配的参数(并且
ListSubfolders
是一个列表,其中的每个元素也与之匹配)。fjnneemd2#
What happens to a recursive function in Elrang when in a list comprehesion the generator is null or empty?
Easy to test:
In the shell:
What would you expect the return value of the following to be:
No different than if you defined:
then executed:
The function doesn't get called if there is no argument to call the function with.
6bc51xsx3#
只是为了更清楚地说明。下面的代码不是用于控制的目的-它们是**'只是'**因为对于根文件夹输入,我们不希望将'|'字符(装饰性的东西)。所以即使您将它变更为
Sign = SignTemp
或Sign = "|" ++ SignTemp
,它不会更改逻辑。在前面的代码中,
Folders
永远不会是[]
,它至少会有{CurrentFolder, []}
的值(可能是空列表的是ListSubfolders
)。由于下面的列表解析应用于ListSubfolders
,所以它是安全的,因为如果ListSubfolders
是[]
,pretty_print
将不会被调用。bzzcjhmw4#
我画这个图是为了说明列表解析是如何工作的,它包含了对函数pretty_print.
的所有递归调用