首页 > 其他分享 >无涯教程-Erlang - 递归

无涯教程-Erlang - 递归

时间:2023-12-02 22:33:04浏览次数:36  
标签:Acc 教程 递归 无涯 len start tail fac 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中可以使用递归没有任何限制。现在让我们快速看一下如何使用递归来反转列表的元素。

-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]

参考链接

https://www.learnfk.com/erlang/erlang-recursion.html

标签:Acc,教程,递归,无涯,len,start,tail,fac,Erlang
From: https://blog.51cto.com/u_14033984/8659280

相关文章

  • FreeRTOS深入教程(中断管理)
    (文章目录)前言本篇文章来分析FreeRTOS中的中断,中断在FreeRTOS中也是非常重要的,那么这篇文章将带大家来学习一下FreeRTOS中的中断处理以及涉及到的API等。一、为什么要为中断设计一套API1.实时性要求:中断服务程序通常用于响应实时事件,例如硬件中断、定时器中断等。为了满足实......
  • 无涯教程-Erlang - 运算符
    Erlang具有以下类型的运算符-算术运算符关系运算符逻辑运算符按位运算符算术运算符Erlang语言支持普通的算术运算符,就像任何一种语言一样,以下是Erlang中可用的算术运算符。运算符描述示例+加1+2=3-减1-2=-1*乘2*2=4/除2/2=1rem余数3rem2=1div......
  • 无涯教程-Erlang - 变量声明
    在Erlang中,所有变量都必须以大写字母开头,要注意的一件事是变量是不可变的,这意味着要更改变量的值,需要将其销毁并重新创建。变量声明定义变量的一般语法如下-var-name=var-valuevar-name-这是变量的名称。var-value-这是绑定到变量的值。-module(helloLearnfk).-e......
  • 无涯教程-Erlang - 数据类型
    您可能希望存储各种数据类型的信息,例如string,character,widecharacter,integer,floatingpoint,Boolean等,系统根据变量的数据类型分配内存。内置数据类型Erlang提供了多种内置数据类型,以下是在Erlang中定义的数据类型的列表-Number  - 在Erlang中,它们是integers和floats。......
  • 我的心血之作:一套适合 SAP UI5 从业人员从入门到进阶的学习教程,以及教程背后的故事
    一转眼2023年又要结束了。我从2007年开始,以软件开发工程师的角色进入职场,马上也快满17年了。在这快17年的软件开发职业生涯里,我也见识并使用了许许多多的开发技术,编程语言,开发框架,平台。IT界这十多年来涌现出的一些新技术,我也主动或被动地去追逐过。比如2015年时,大......
  • 无涯教程-Erlang - Shell脚本
    ErlangShell用于测试表达式,以下示例展示了如何在Shell中使用加法表达式,这里需要注意的是,表达式必须以点(.)分隔符结尾。执行命令后,Shell程序会打印出一个提示,这一次是命令编号2(因为每次输入新命令时命令编号都会增加)。以下功能是ErlangShell中最常用的功能。b()   ......
  • CAD安装教程,一站式解答
    AutoCAD2023是一款由美国Autodesk公司开发的计算机辅助设计(CAD)软件,它是全球最流行的二维和三维设计工具之一。自1982年首次发布以来,AutoCAD已经成为建筑、机械、电子、航空、制造等众多行业的标准设计工具。AutoCAD2023是该软件的最新版本,它在前一版本的基础上进行了许多改进和优......
  • 无涯教程-D语言 - 类静态方法函数
    让我们尝试以下示例以了解静态数据成员的概念-importstd.stdio;classBox{public:staticintobjectCount=0;//构造函数定义this(doublel=2.0,doubleb=2.0,doubleh=2.0){writeln("Constructorcalled.");length=l;......
  • 无涯教程-Erlang - 简介
    Erlang(/ˈɜːrlæŋ/)是一种通用的并发程序设计语言,它由乔·阿姆斯特朗(JoeArmstrong)在瑞典电信设备制造商爱立信所辖的计算机科学研究室开发,目的是创造一种可以应付大规模并发活动的程序设计语言和运行环境。Erlang于1987年发布正式版本,最早是爱立信拥有的私有软件,经过十年的发......
  • 无涯教程-D语言 - 构造与解析函数
    类构造函数类构造函数是该类的特殊成员函数,只要我们创建该类的新对象 ,该函数便会执行。构造函数的名称与类完全相同,没有任何返回类型,构造函数对于为某些成员变量设置初始值非常有用。以下示例解释了构造函数的概念-importstd.stdio;classLine{public:void......