循环模拟如何工作?

时间:2016-12-07 01:58:54

标签: list loops erlang

-module(prac).

-export([len/1]).

len([]) -> 

   0;

len([_|T]) ->

   1 + len(T).

所以我有这个代码并且它有效,但我不知道如何正确地模拟它。

1 个答案:

答案 0 :(得分:2)

好的,如果您正在寻找代码为何如此工作的解释,那就是这样的。给出以下代码:

len([])    -> 0;
len([_|T]) -> 1 + len(T).

如果您要像len/1那样致电len([a,b,c]),那么您可以将其视为执行:

  • 致电len([a,b,c])
  • [a,b,c]匹配[]吗?无
  • [a,b,c]匹配[_|T]吗?是的,屈服于_ = aT = [b,c]
  • 致电len([b,c])
    • [b,c]匹配[]吗?无
    • [b,c]匹配[_|T]吗?是的,屈服于_ = bT = [c]
    • 致电len([c])
      • [c]匹配[]吗?无
      • [c]匹配[_|T]吗?是的,屈服于_ = cT = []
      • 致电len([])
        • []匹配[]吗?是
        • len([])返回0
      • len([c])返回1 + 0
    • len([b,c])返回1 + 1
  • len([a,b,c])返回1 + 2

这有意义吗?