大家好,我正在关注http://learnelixir.tv的截屏视频,这些视频非常棒,这是我的第一个基于函数的编程语言,但我真的很喜欢它。
我目前正在学习列表,我们制作了一个自定义长度函数,如下所示:
defmodule MyList do
def length(list) do
length(list, 0)
end
defp length([], count) do
count
end
defp length([_|t], count) do
length(t, count + 1)
end
end
Run Code Online (Sandbox Code Playgroud)
哪个效果很好
MyList.length([1, 2, 3, 4])
// 4
Run Code Online (Sandbox Code Playgroud)
所以根据我的理解,我们最初传入了对非私有函数的第一次调用,length-private现在调用虚拟机是否正常有 2 个版本,一个接受空数组,一个接受非空数组?
为什么它不直接跳到length([], count)第一个并返回,count // 0而是转到最后一个声明的length函数,
(小题)
count 如何在 2 个私有长度函数之间共享,以及如何[_|t]改变数组并在 2 个函数之间共享它?
它使用所谓的模式匹配来选择正确的函数。所以它检查第一个参数是否是一个空列表,如果是,它将使用第一个函数,如果不是,它将使用第二个。你可以在这里阅读
该列表(这不是一个数组)和计数器不发生变异。您只需为每个函数调用使用不同的值。这是它的工作原理:
当您第一次调用您的函数时,它会在公共函数之间进行模式匹配,因为只有一个并且它匹配任何具有 1 个参数的函数调用,它会被调用。
然后它length(list, 0)再次调用which 进行模式匹配,但包括私有函数,并且由于它有两个参数并且第一个不是空列表,所以它转到第三个函数。
第三个函数又length再次调用该方法,但传递不同的参数,在您的示例中,这些参数是length([1,2,3], 1).
它一直持续到列表为空,所以它会调用length([1,2], 2),length([1], 3)依此类推。
当它调用length([], 4)第二个函数时,因为第一个参数匹配而被调用。第二个函数只返回计数器,即 4,这是您获得的最终值。
所以如你所见,没有发生变异,这个过程称为递归