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

G ++编译器不允许递归?

您好!关于G++编译器不允许递归的问题,我们可以从以下几个方面进行讨论:

  1. G++编译器本身并没有限制递归的功能,但是在编写递归函数时需要注意递归深度和栈空间的限制。如果递归深度过大,可能会导致栈溢出,从而导致程序崩溃。
  2. 在使用G++编译器进行编译时,可以使用-O2或-O3选项来开启优化,这样可以帮助编译器更好地处理递归函数,提高程序的运行效率。
  3. 如果递归函数的实现不当,可能会导致程序的性能下降或者出现死循环等问题。因此,在编写递归函数时,需要仔细考虑函数的递归条件和递归终止条件,以及递归函数的参数和返回值等。

总之,G++编译器本身并没有限制递归功能,但是在实际编程中需要注意递归深度和栈空间的限制,以及递归函数的实现。

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

相关·内容

  • 动手写编译器:左递归消除和无歧义算术表达式解析代码实现

    我们看到代码有问题,那就是函数A执行时直接调用了它自己,于是就会形成无限递归最终以栈被撑爆结束。.... |"9" 同样list生产式也产生了左递归,因此我们的代码套路无法使用。...这种情况叫语法定义的左递归,我们需要使用一些办法处理它,好在有固定的套路,其处理方法如下,例如有如下的左递归生产式: X -> X Y Z | "x" 那么我们把 Y Z 用另一个非终结符α表示,也就是...有了上面的基础后,我们再次修改算术表达式的语法生产式,处理其中的歧义,处理左递归,最后我们给出它的解析代码。...由于语法中存在左递归,因此我们需要先处理。

    31220

    Kotlin中的一些技巧与迂回操作分享

    递归的 Lambda 表达式 刚才在某个 Kotlin 裙里看到有人在问: 是不是lambda无法递归 举个例子,我们可以写一个简单的递归函数: fun a() { println("1551"...正统的「Lambda演算」里面的函数全部都是匿名函数,需要使用「不动点组合子」实现递归: // 这是kotlin-js val z = { f: dynamic - { g: dynamic -...g(g) } { x: dynamic - f { y: dynamic - x(x)(y) } } } val a = z { f: () - Unit - { println("1551...如果不想编译器生成这些代码,把这几个编译器参数 -Xno-call-assertions、-Xno-param-assertions、-Xno-receiver-assertions 传给Kotlin编译器即可...给data class自定义getter和setter data class SomeClass(var name: String) 众所周知 Kotlin 不允许给声明在主构造器里面的属性写自定义getter

    71610

    C++11:可变参数模板lambda表达式

    递归函数方式展开参数包 //递归终止函数 template void showList(const T& t) { cout << y << endl; } //展开函数 template...然后通过递归,看看args里面有多少个参数,如果只有一个,比如这里的'A',那么就会去调用第一个showList函数。...逗号表达式展开参数包 这种展开参数包的方式,不需要通过递归终止函数,是直接在expand函数体中展开的, printarg不是一个递归终止函数,只是一个处理参数包中每一个参数的函数。...返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。...捕捉列表不允许变量重复传递,否则就会导致编译错误。比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复 d. 在块作用域以外的lambda函数捕捉列表必须为空。 e.

    1.1K40

    有趣的 go: 指令

    因此只有引用了 unsafe 包才可以使用简单来讲,就是 importpath.name 是 localname 的符号别名,编译器实际上会调用 localname 。...但前提是使用了 unsafe 包才能使用go:noescape//go:noescape该指令指定下一个有声明但没有主体(意味着实现有可能不是 Go)的函数,不允许编译器对其做逃逸分析一般情况下,该指令用于内存分配优化...因为编译器默认会进行逃逸分析,会通过规则判定一个变量是分配到堆上还是栈上。但凡事有意外,一些函数虽然逃逸分析其是存放到堆上。但是对于我们来说,它是特别的。...,并且允许递归。...sys *SysProcAttr, pipe int) (pid int, err Errno) { ...}go:notinheap//go:notinheap该指令常用于类型声明,它表示这个类型不允许

    31220

    大学课程 | 编译原理知识点

    递归下降?LL(1)判断是不是?消除左递归,提取左公因子,First集follow集,构造分析表,对一个句子分析。LL(1)三种基本动作:生成(最左推导),匹配,接受。 自底向上?...综合属性,基本属性 了解几种运行环境的特点:Fortran77 完全静态,不允许递归调用。基于栈的C,C++,Pascal。...;LL(1)分析 LL(1)文法 LL(1)分析:第一个L指由左向右处理输入,第二个L为输入串描绘出一个最左推导,1是指先行一个符号 使用显示栈来完成分析 是非二义性的文法 对于文法G,其相关的LL(1...构造LL(1)预测分析表 对于文法G的每一个产生式A→α执行第2,3步 对每个终结符a∈FIRST(α),把A→α加到M[A,a]中 若ε∈FIRST(α),则对任何b∈FOLLOW(A)把A→α加入[...这样的环境可用来实现没有指针或动态分配,且过程不可递归调用的语言。 基于栈的环境:C,C++,Pascal,Ada。在允许递归调用以及每一个调用中都重新分配局部变量的语言中,不能静态地分配活动记录。

    1.3K30

    c语言之函数的本质和使用及递归函数

    (2)函数的出现是人(程序员和架构师)的需要,而不是机器(编译器、CPU)的需要。...(2)函数原型的主要作用就是给编译器提供原型,让编译器在编译程序时帮我们进行参数的静态类型检查。...(3)必须明白:编译器在编译程序时是以单个源文件为单位的(所以一定要在哪里调用在哪里声明),而且编译器工作时已经经过预处理处理了,最最重要的是编译器编译文件时是按照文件中语句的先后顺序执行的。  ...(4)编译器从源文件的第一行开始编译,遇到函数声明时就会收到编译器的函数声明表中,然后继续向后。...如果没有或者只有部分匹配则会报错或报警告;如果发现多个则会报错或报警告(函数重复了,C语言中不允许2个函数原型完全一样,这个过程其实是在编译器遇到函数定义时完成的。

    68960

    Android面试题之Kotlin 内联函数

    参数的函数使用 inline 不带参数,或是带有普通参数的函数,不建议使用 inline inline 可以让函数参数里面的 return 生效 主要作用 减少开销:内联函数可以避免函数调用的开销,因为编译器会将函数的代码直接插入到调用点...因为「不允许这么做」 inline fun ordinaryFunction(block: () -> Unit) { println("hahha") block.invoke()...println("hahha233333") } 内联函数的「函数参数」 不允许作为参数传递给非内联的函数(禁止内联:noinline) inline fun foo(testName:String,...递归调用:内联函数不能进行递归调用,因为递归调用会导致无限地展开。 高级特性限制:某些高级特性(如协程等)在内联函数中可能会有一些限制,需要根据具体情况进行处理。

    9910

    CS143 编译器笔记

    视频链接:CS143 编译器1 词法分析识别 token,例如关键字、标识符、数字、操作符等。正则文法有限自动机确定性有限自动机 DFA,每个输入只对应一个状态,转换过程中没有 epsilon。...最左推导:存在无限递归问题,可以改写语法,改为右递归语法。LL(k):从左到右查看 token,最左推导。先求出 first set 和 follow set,然后构建解析表格。...活动记录 AR:如果 F 调用 G,那么 G 的活动记录包含 F 和 G 的信息,因为需要回到 F。AR 包括 result,arg,return address。...管理缓存:光靠编译器比较难做到,还需要靠程序员,比如写循环时,将内循环的变量赋值给外循环,可以提高缓存利用率。自动内存管理 / 垃圾回收如何知道一个对象不会再被用到?程序只能使用它可以找到的对象。...最快的 GC,但是一些语言不允许拷贝,如 C/C++方式三:引用计数优点:实现容易;垃圾回收时无需太多停顿。缺点:无法回收 circular 结构;每次赋值时操作引用计数比较慢。

    59020

    【C语言】内联函数总结

    inline仅是一个对编译器的建议 inline函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已...如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。...关键字是一个预处理关键字 参数类型检查 inline()函数是一中函数,会进行严格的参数类型检查 不会检查参数类型,只是做简单的字符串替换,因此在使用带参数的宏时会有一些副作用,编写程序是要人为预防 是否允许有复杂语句 不允许出现复杂语句...,如果出现复杂语句,该函数将不会展开,例如递归,大型循环等 对此不做要求。...内联函数不可递归。 如果函数内容太过于复杂,编译器会忽略inline关键字,把他当成普通函数来处理。

    29910

    65.精读《手写 SQL 编译器 - 文法介绍》

    消除左递归 消除左递归一般通过转化为右递归的方式,因为左递归完全不消耗 Token,而右递归可以通过消耗 Token 的方式跳出死循环。...Token 见上一期精读 精读《手写 SQL 编译器 - 词法分析》 ::= ::= , |...null 这其实是一个通用处理,可以抽象出来: E → E + F E → F E → FG G → + FG G → null 不过我们也不难发现,通过通用方式消除左递归后的文法更难以阅读,这是因为用死循环的方式解释问题更容易让人理解...Text> ::= as ::= | 和消除左递归一样,提取左公因式也会降低文法的可读性,需要进行人为修复。...下一篇将介绍语法分析相关知识,帮助你一步步打造自己的 SQL 编译器。 4 更多讨论 讨论地址是:精读《手写 SQL 编译器 - 文法介绍》 · Issue #94 · dt-fe/weekly

    56020

    大家都知道递归,尾递归呢?什么又是尾递归优化?

    今天,我们来聊聊递归函数。为啥突然想到递归?其实就从电影名字《恐怖游轮》《盗梦空间》想到了。 递归是啥? 递归函数大家肯定写过,学校上课的时候,估计最开始的例子就是斐波拉契数列了吧。...原因就是因为编译器帮助做了尾递归优化,可以打开汇编代码看看(这里就不展示 C++的了)。后面我用大家比较熟悉的 JVM based 语言 Scala 来阐述这个优化过程。...(好像 Java 的编译器没做这方面的优化,至少我实验我本地 JDK8 是没有的,不清楚最新版本的有木有)(scala 本身提供了一个注解帮助编译器强制校验是否能够进行尾递归优化@tailrec) object...,能够正确计算出结果,当通过 -g:notailcalls 编译参数去掉尾递归优化后,就发生了 Exception in thread "main" java.lang.StackOverflowError...个人看法,我们知道有“尾递归”这个点就好了,有时候我们写递归就是为了方便,代码可读性好,如果确实是出于性能考虑,我们可以自己用迭代的方式去实现,不依赖于具体的编译器实现。

    1.5K30

    【C++】——入门基础知识超详解

    例如,void func(int a = 1, int b); 是不允许的,因为 b 没有缺省值,而 a 有。...不同编译器有不同的函数名修饰规则。 由于 Windows 下 VS 的修饰规则过于复杂,而 Linux 下 G++ 的修饰规则简单易懂,我们使用 G++ 演示修饰后的名字。...在 G++ 中,函数名修饰后的名字是 _Z + 函数长度 + 函数名 + 类型首字母。...建议使用场景:将小规模、非递归、且频繁调用的函数使用 inline 修饰。长函数或递归函数不适合使用 inline,编译器可能会忽略 inline。...不适合将大函数和递归函数设为内联,因为这会增加代码体积并可能导致编译器忽略 inline 关键字。 内联函数通常在头文件中定义,因为内联函数在编译阶段展开,需要在每个调用的地方都能看到函数体。

    10710
    领券