Erlang - 递归

Erlang - 递归 首页 / Erlang入门教程 / Erlang - 递归

递归是Erlang的重要组成部分,首先,让我们看看如何通过实现阶乘程序来实现简单的递归。

-module(helloLearnfk). 
-export([fac/1,start/0]). 

fac(N) when N == 0 -> 1; 
fac(N) when N > 0 -> N*fac(N-1). 

start() -> 
   X=fac(4), 
   io:fwrite("~w",[X]).

关于上述程序,需要注意以下几点:

  • 我们首先定义一个名为fac(N)的函数。

  • 我们能够通过递归调用fac(N)函数。

上面程序的输出是-

24

在本节中,我们将详细了解递归的不同类型及其在Erlang中的用法。

Length递归

通过一个用于确定列表长度的简单示例,可以看到一种更实用的递归方法。列表可以具有多个值,如[1,2,3,4]。

-module(helloLearnfk). 
-export([len/1,start/0]). 

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

start() -> 
   X=[1,2,3,4], 
   Y=len(X), 
   io:fwrite("~w",[Y]).

关于上述程序,需要注意以下几点:

  • 如果列表为空,则第一个函数 len([])用于特殊情况。

  • [H | T] 模式与一个或多个元素的列表匹配,因为长度为1的列表将定义为 [X | []] ,长度为2的列表将定义为 [X | [Y | []]] 。

上面程序的输出将是-

无涯教程网

4

Tail尾递归

为了了解尾递归的工作原理,让我们了解上一节中的以下代码如何工作。

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

让我们看一下尾递归的示例-

-module(helloLearnfk).
-export([tail_len/1,tail_len/2,start/0]). 

tail_len(L) -> tail_len(L,0). 
tail_len([], Acc) -> Acc; 
tail_len([_|T], Acc) -> tail_len(T,Acc+1). 

start() -> 
   X=[1,2,3,4], 
   Y=tail_len(X), 
   io:fwrite("~w",[Y]).

上面程序的输出是-

4

我们来看一个递归示例。这次让我们编写一个函数,该函数将整数作为第一个参数,然后将任何其他术语作为第二个参数。

-module(helloLearnfk). 
-export([duplicate/2,start/0]). 

duplicate(0,_) -> 
   []; 
duplicate(N,Term) when N > 0 ->
   io:fwrite("~w,~n",[Term]),
   [Term|duplicate(N-1,Term)]. 
start() -> 
   duplicate(5,1).

上面程序的输出将是-

无涯教程网

1,
1,
1,
1,
1,

List递归

在Erlang中可以使用递归没有任何限制。现在让我们快速看一下如何使用递归来反转列表的元素。

链接:https://www.learnfk.comhttps://www.learnfk.com/erlang/erlang-recursion.html

来源:LearnFk无涯教程网

-module(helloLearnfk). 
-export([tail_reverse/2,start/0]). 

tail_reverse(L) -> tail_reverse(L,[]).

tail_reverse([],Acc) -> Acc; 
tail_reverse([H|T],Acc) -> tail_reverse(T, [H|Acc]).

start() -> 
   X=[1,2,3,4], 
   Y=tail_reverse(X), 
   io:fwrite("~w",[Y]).

上面程序的输出将是-

无涯教程网

[4,3,2,1]

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

MySQL实战45讲 -〔林晓斌〕

手机摄影 -〔@随你们去〕

手把手教你玩音乐 -〔邓柯〕

陶辉的网络协议集训班02期 -〔陶辉〕

高楼的性能工程实战课 -〔高楼〕

说透5G -〔杨四昌〕

结构思考力 · 透过结构看思考 -〔李忠秋〕

结构思考力 · 透过结构看表达 -〔李忠秋〕

超级访谈:对话道哥 -〔吴翰清(道哥)〕

好记忆不如烂笔头。留下您的足迹吧 :)