首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这个递归打印函数在Erlang中不起作用

递归打印函数在Erlang中可能不起作用的原因有以下几点:

  1. 语法错误:在编写递归函数时,可能存在语法错误,导致函数无法正确执行。在Erlang中,函数定义需要使用模式匹配,确保函数名和参数匹配正确。
  2. 递归终止条件不正确:递归函数需要定义一个终止条件,以避免无限递归。如果终止条件不正确或者缺失,函数将无法停止递归,导致程序崩溃或者陷入死循环。
  3. 栈溢出:Erlang中的递归函数默认使用堆栈来保存函数调用的上下文信息。如果递归深度过大,堆栈可能会溢出,导致程序崩溃。可以通过优化递归算法或者使用尾递归优化来解决这个问题。
  4. 并发调度问题:Erlang是一种并发编程语言,它使用进程来实现并发。如果递归函数在并发环境中被调用,可能会遇到并发调度问题,导致函数无法按预期执行。可以通过使用消息传递和同步原语来解决并发调度问题。

总结起来,递归打印函数在Erlang中不起作用可能是由于语法错误、递归终止条件不正确、栈溢出或者并发调度问题等原因导致的。在编写递归函数时,需要仔细检查语法和逻辑,并确保终止条件的正确性,同时注意处理栈溢出和并发调度问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 strace Docker 不起作用

在编辑“容器如何工作”爱好者杂志的能力页面时,我想试着解释一下为什么 strace Docker 容器无法工作。...为什么 strace 不能工作,为什么--cap-add=SYS_PTRACE 可以解决这个问题? 假设 1:容器进程缺少 CAP_SYS_PTRACE 能力。...为什么?! 假设 2:关于用户命名空间的事情? 我的下一个(没有那么充分的依据的)假设是“嗯,也许这个过程是不同的用户命名空间里,而 strace 不能工作,因为某种原因而行不通?”...这个问题其实并不相关,但这是我观察时想到的。 容器进程是否不同的用户命名空间中?嗯,容器: root@e27f594da870:/# ls /proc/$$/ns/user -l ......这很容易解释为什么 strace Docker 容器不能工作 —— 如果 ptrace 系统调用完全被屏蔽了,那么你当然不能调用它,strace 就会失败。

6.2K30

Python程序设置函数最大递归深度

函数调用时,为了保证能够正确返回,必须进行保存现场和恢复现场,也就是被调函数结束后能够回到主调函数离开时的位置然后继续执行主调函数的代码。...这些现场或上下文信息保存在线程栈,而线程栈的大小是有限的。 对于函数递归调用,会将大量的上下文信息入栈,如果递归深度过大,会导致线程栈空间不足而崩溃。...Python,为了防止栈崩溃,默认递归深度是有限的(某些第三方开发环境可能略有不同)。下图是IDLE开发环境的运行结果: ? 下图是Jupyter Notebook的运行结果: ?...因此,在编写递归函数时,应注意递归深度不要太大,例如下面计算组合数的代码: ? 如果确实需要很深的递归深度,可以使用sys模块的setrecursionlimit()函数修改默认的最大深度限制。

2.9K20

【专业技术】CC++程序打印当前函数调用栈

基于这个事实,我想到了这样一个办法,程序开始时,通过系统提供的atexit(),向系统注册一个回调函数程序调用exit()退出的时候,这个回调函数就会被调用,然后我们回调函数打印出当前的函数调用栈...在上面,我提到了“回调函数打印出当前的函数调用栈”,相信细心的朋友应该注意到这个了,本文的主要内容就是详细介绍,如何在程序打印当前的函数调用栈。.../test1()[0x400529] 从上面的运行结果,我们的确看到了函数的调用栈,但是都是16进制的地址,会有点小小的不爽。当然我们可以通过反汇编得到每个地址对应的函数,但这个还是有点麻烦了。...从上面的说明可以看出,它的主要作用是让链接器把所有的符号都加入到动态符号表,这下明白了吧。不过这里还有一个问题,这里的函数名都是mangle过的,需要demangle才能看到原始的函数。...不过不知道大家有没有想过这样一个问题,同一个函数可以代码多个地方调用,如果我们只是知道函数,而不知道在哪里调用的,有时候还是不够方便,bingo,这个也是有办法的,可以通过address2line命令来完成

2.7K40

nextline函数_JAVAScanner的next()和nextLine()为什么不能一起使用?

回车符 “\r” 它被丢弃缓冲区,现在缓冲区,只有一个 \r ,于是 下一次 nextLine 扫描的时候就又扫描到了 \r,返回它之前的内容,也是啥都没有 “” ,然后再把 \r 去掉, 对于...“abc” 的情况分析: 下一次我们输入的是 abc\r,此时这个就是缓冲区的全部内容 所以下一次 nextLine 调用的时候,就返回 abc,再把 \r 去掉 输入 2: 2 abc bcf efg...这个扫描器扫描过程判断停止的依据就是“结束符”,空格,回车,tab 都算做是结束符 而坑点在于 next 系列的,也就是下面这些函数:next nextInt nextDouble nextFloat...这些函数与 nextLine 连用都会有坑 坑点就是 next 系列的函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用 nextLine 的时候会碰到读取空字符串的情况 解决方案:输入都用...nextLine ,做格式转换 输入 next 系列函数调用后,中间调用一次 nextLine 调用去掉了回车符后,再调用一次 nextLine 调用真正输入我们的数据 都使用 nextLine: class

2.6K10

为什么应该尽可能避免静态构造函数初始化静态字段?

不同的是Foo以内联(inline)赋值的方法进行初始化,而Bar则将初始化操作定义静态构造函数。...我们可以进一步看出,自动生成的这个静态构造函数和我们自己写的并没有本质的不同。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义Foo的静态构造函数会自动执行,但是定义Bar的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具体规则如下,这一个规则直接定义CLI标准ECMA-335,静态构造函数在此标准中被称为类型初始化器(Type Initializer)或者.cctor。...四、关于“All-Zero”结构体 如果我们一个结构体显式定义了一个静态构造函数,当我们调用其构造函数之前,静态构造函数会自动执行。

16310

超级简单!Elixir和ScyllaDB教你创建CRUD CLI,惊人的效率提升!

我们定义username并password从文件接收这些值.env;Xandra我们使用来自 name 的函数初始化集群Xandra.Cluster.start_link,负责启动与集群的连接链接在这个函数我们定义了...创建文件后,我们现在可以创建两个特定的函数,但为什么是两个呢?...添加好吧,这个命令将用于将歌曲添加到我们的数据库。因此,我们将其分为两个主要函数,即add和add_from,它们接收四个要执行的参数。...本例,该函数期望收到一个包含所选各个字段的映射;我们打印具体的值;最终这将是我们的回归;一个重要的细节:在这种情况下,run_query如果我们插入了多行,将返回多个值,对吧?...stress调用该Commands.stress()函数;exit打印一条再见消息并返回:ok,定义该函数不再进入递归循环,结束我们的应用程序;_打印命令未找到消息并进入递归循环,等待新输入;好了,现在我们的主要功能已经准备好了

38230

elixir:灵丹妙药?or 徒有其名?

13年的时候正在追Erlang,有天看见Joe老爷子的一篇博客介绍Elixir [1],才第一次听到这个语言。...这个代码里同一个 run 被定义了很多次,根据参数的不同,会调用不同的函数。我们再看一个例子: ?...天生的concurrency支持 这个就不多说了,Erlang的基于actor的并发模型,let it crash的处理思想,supervision tree,error kernel,都是二十多年来与并发作斗争过程不断总结出来的...✓ 提倡使用递归递归就是以自身为积木) ✓ 以pattern matching的方式组织代码(每个代码快尽可能小,只处理一件简单的事情) ✓ 语言层面提供解耦的工具(如erlang的process,golang...Erlang的VM 3. 初学者Erlang的世界里很容易找不到北,这个,走过这段路的人都有感受 4.

1.4K50

(译) Understanding Elixir Macros, Part 4 - Diving Deeper

追踪函数调用 本文中, 我们将创建一个宏 deftraceable, 它允许我们定义可跟踪的函数. 可跟踪函数的工作方式与普通函数一样, 但每当我们调用它时, 都会打印出调试信息....我们从编译器环境获取各种数据, 然后计算结果, 最后将所有内容打印到屏幕上. 该代码依赖于 __ENV__ 特殊形式, 可用于最终 AST 中注入各种编译时信息(例如行号和文件)....所以接下来我们需要: 从 quoted 的头中提取函数名和参数 将这些值注入我们的宏返回的 AST 函数体注入同一个 AST 打印跟踪信息 我们可以使用模式匹配从这个 AST 片段中提取函数名和参数...当然, 我们需要从宏调用这个函数: defmodule Tracer do ......在这个例子, 我们设法检测和处理函数 guards. 显然, 因为它依赖于 AST 的内部结构, 代码变得更加复杂了.

8430

python之day3(文件操作、字符转

log() func1() func2() func3() 4、 为什么要使用函数 代码重复利用 保持一致性 可扩展性 5、 函数的返回值 def test1():     print("in the...before change  alex after change Alex alex 局部变量默认无法改全局变量的内容,除非使用global强制声明,如:globalname 例子程序2: 列表、字典、集合、类子程序即函数修改局部变量就会影响全局变量...8、 递归函数内部,可以调用其它函数,如果一个函数在内部调用自身,这个函数就是递归函数。...递归函数的特性: 必须要有一个明确的结束条件;(否则是死循环,程序默认保护机制循环999,然后报错) 每次进入更深一层递归时,问题规模相比上次递归都应有所减少; 递归效率不够,递归层次过多会导致栈溢出;...python对函数式编程只支持一部分 函数式编程语言有:erlang\lisp\hashshell 函数式编程举例,想要实现(1+2)*3-4,函数式编程: varresult=subtract(multiply

60960

【12】Python函数学习(

这个函数就是这个变量的作用域) def logers(name): print('before change:',name)     name='ALEX' print('after change...): global name  #这个作用是把 name定义为全局变量     name='alex' student() print(name) 为啥:容易混乱程序(找bug找死你) 递归:(函数内部可以调用自己...(计算机函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以递归次数过多会导致栈溢出。)...def calc(n):   #程序开始,取calc实参 print(n)  #打印判断结果 if int(n/2) >0 : return calc(int(n/2)) #递归 print(...想学函数式编程可以学lisp、hashshell、erlang 高阶函数: 变量可以指向函数函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就叫做高阶函数

51710

代码结构的演进

为了让代码更可读,从goto衍生出了更好的控制逻辑:分支,循环(或者递归),以及用于管理目的的 [1] 函数,类 [2] 和模块。代码可以以更清晰,更可控地方式被撰写。...大部分软件,尽管从静态的角度来看,模块化和关注点分离已经做到了足够好,代码与代码之间甚至物理上都被树状的文件系统隔离,可当其编译运行起来成一个进程后,这种隔离消失了,所有的运行的代码又被统统揉了一个平面...可程序员们还在呼唤更好的解决之道:既然静态的代码可以用树状的层级结构来管理,为什么运行时的代码不能采用同样的方式呢?...大家的目光停留到了erlang这个诞生于上世纪80年代,静静躺在不为人知的角落里的语言。...erlang,actor则相当于软件的细胞。若干个细胞结合起来,成为软件的组织;若干组织结合起来,成为软件的器官,然后再结合成整套软件。这种软件的组合模式看上去像是这样: ?

1.1K50

各种编程语言对尾递归的支持

递归   这篇文章,我们讲尾递归递归中,如果该函数递归形式表现在函数返回的时候,则称之为尾递归。   ...函数的计算会维护一个栈,每当遇到函数调用会记录当前运行的状态,如此函数返回的时候可以恢复上下文。   ...这里,可以采用一个编译技术,就是尾递归优化,其一般情况是,如果一个函数的计算遇到了完全转化成另一个函数调用的情况,那么栈的当前函数部分的信息可以完全抹去,而替换为新的函数。...sbcl是Common Lisp的另外一个实现,在这个实现,我们使用第一个add函数的版本,没有发生崩栈。...false   显然,Erlang对尾递归支持很好。

2.6K20

基于消息传递的并发模型

代码和Go代码分别实现打印服务print_server,用来对比模型使用差异 Actor模型-Erlang代码 %%%------------------------------------------...语法实现的,也可以使用OTP gen_server原语实现更加清晰易懂 CSP模型-Go代码 print函数从channel读取消息并阻塞,直到主函数向channel写入hello消息 package...进程之间的唯一交互方式就是消息传递:Erlang没有像C++那样,进程间拥有多种不同的交互方式(管道、消息队列、存储共享等等)。...FAQ 为什么没有容量自动增大的缓冲区? 即使现在有一个看上去永不枯竭的资源,总有一天这个资源还是会被用尽的。...如果没有思考缓冲区塞满时的对策,那么未来的某个时间就有可能出现一个破坏性极强,隐蔽性极深且难以诊断的bug。最好的策略是现在就思考如何处理缓存区被塞满的情况,将问题消灭萌芽阶段。

73731

函数式编程那些事儿

此外,纯函数使编写并发应用程序更加容易。 使用函数式编程风格编写代码时,有能力的编译器将能够: 记住结果 并行运算 等待评估结果 递归 函数式编程范例,没有for和while循环。...相反,函数式编程语言依赖于递归进行迭代。递归是使用递归函数实现的,递归函数会重复调用自己,直到达到基本情况为止。 引用透明性 一旦函数式编程语言中定义了变量,就不允许程序执行期间更改它们持有的值。...为了使用功能编程开发的程序存储其他值,必须定义新变量。在这样的程序,变量的状态在任何时候都是恒定的。...这些一流的函数被允许作为参数传递给其他函数,或者从函数返回或存储在数据结构。 高阶函数是将其他函数用作参数和/或返回函数函数函数式编程语言中,一等函数可以是高阶函数。...缺点 不变的值与递归结合可能会导致性能下降 某些情况下,编写纯函数会导致代码的可读性下降 尽管编写纯函数很容易,但是将其与应用程序的其余部分以及I / O操作结合起来很困难 以递归方式编写程序来代替使用循环

84840

Erlang 和 Elixir 介绍

在编程范型上,Erlang属于多重范型编程语言,涵盖函数式、并发式及分布式。顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。...外部接口 - Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 Fail-fast(速错机制),即尽可能快的暴露程序的错误。...Elixir 是一个基于 Erlang 虚拟机的函数式、面向并行的通用编程语言。...他创造该语言的目标是维持与现有 Erlang 工具链及生态环境兼容性的同时,让人们可以 Erlang 虚拟机上进行扩展性更好的、高生产率的开发。...强调利用递归和高阶函数函数式编程胜过基于副作用和循环的命令式编程。 一切均为表达式。 惰性求值,拥有诸如 futures 和 promises 一类的异步流数据类型。 模式匹配。

2K30
领券