迭代和递归的实例 举例说明什么是句法结构的递归性,递归?
浏览量:1792
时间:2021-03-16 22:55:55
作者:admin
举例说明什么是句法结构的递归性,递归?
同样的语法结构可以层层嵌套,同一条结构规则可以重复使用而不致造成结构上的混乱,借数学的术语来说,这就是语法结构规则的"递归性"。 在句法组合中,递归性有两种表现,一种是从初始结构开始,自始至终重复运用同一条语法规则。例如"计算机/我//喜欢"这个句子是主谓结构,它们的谓语( / 以后的部分)本身又是主谓结构,这里,"主语 谓语"这条语法规则不间断地使用了两次;另外一种表现是,同一条语法规则可以在一个结构上间隔地重复使用。 例如在"我/看///过//他/////写////的///散文"中,第一层使用了"主语 谓语"规则,造成了"我/看过他写的散文"这个主谓结构,第五层又使用了一次"主语 谓语"规则,造成了"他写"这个主谓结构。
尾递归究竟是好是坏?
概念
递归如果层次太多,就会照成栈溢出异常,因为每调用一次就会新生成一个栈帧,使用这个栈帧保留当前函数的状态值。如果没有必要保存状态值,那么就可以复用栈帧,不会造成栈溢出。
举例
这里以求n的阶乘举例:
正常递归:
假如n=3;那么每一步都需要保留n值以及下一步函数的返回值,所以每次调用都需要创建一个新的栈帧
尾递归:
假如n=3,这里每一次调用是可以复用栈帧的,因为不需要保存状态值。
总结
所以说当递归是在当前栈帧执行完之后,不需要再保留当前栈帧,而是带着当前栈帧的结果,进入到下一栈帧,就可以优化为尾递归,一般尾递归需要满足递归调用是函数体中最后执行的语句。比如阶乘的例子中最后执行的语句是直接调用factorial(n-1, n*result),而不是一个表达式n * factorial(n -1),如果是表达式的话就需要一个栈帧来保留n和factorial(n -1)的结果。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。