尾递归是什么意思 尾递归究竟是好是坏?
尾递归究竟是好是坏?概念递归如果层次太多,就会照成栈溢出异常,因为每调用一次就会新生成一个栈帧,使用这个栈帧保留当前函数的状态值。如果没有必要保存状态值,那么就可以复用栈帧,不会造成栈溢出。举例这里以
尾递归究竟是好是坏?
概念
递归如果层次太多,就会照成栈溢出异常,因为每调用一次就会新生成一个栈帧,使用这个栈帧保留当前函数的状态值。如果没有必要保存状态值,那么就可以复用栈帧,不会造成栈溢出。
举例
这里以求n的阶乘举例:
正常递归:
假如n=3;那么每一步都需要保留n值以及下一步函数的返回值,所以每次调用都需要创建一个新的栈帧
尾递归:
假如n=3,这里每一次调用是可以复用栈帧的,因为不需要保存状态值。
总结
所以说当递归是在当前栈帧执行完之后,不需要再保留当前栈帧,而是带着当前栈帧的结果,进入到下一栈帧,就可以优化为尾递归,一般尾递归需要满足递归调用是函数体中最后执行的语句。比如阶乘的例子中最后执行的语句是直接调用factorial(n-1, n*result),而不是一个表达式n * factorial(n -1),如果是表达式的话就需要一个栈帧来保留n和factorial(n -1)的结果。
王垠的“40行代码”真如他说的那么厉害吗?
王大师已经变成孔乙己了,茴香豆的茴字有几种写法。来来回回这么多年了,以他的名气和地位,没做出一个有用的东西。基础研究也没见什么成果。是技术上没见成绩,商业上也没有见成绩。没有一个安身立命的作品,太虚了。厉害,我只能说厉害,我看不懂。
Lisp值得去学习吗?
谢谢邀请!
首先要说Lisp 是否值得学习那么要先知道Lisp到底是什么?
LISP,全名LIST Processor,即链表处理语言是一种计算机程序设计语言。由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。其创作背景为:1958年夏,来自麻省理工学院的人工智能研究先驱——约翰·麦卡锡参与IBM资讯研究部的工作,研究符号运算及应用需求。但当时IBM旗下的Fortran不要处理语言不能支援符号运算的递归、条件表达式、动态储存分配及隐式回收等功能。于是在1958年秋回到麻省理工学院后,开展研发了表处理语言——LISP。
约翰·麦卡锡
LISP为函数式程序设计语言,所有运算都能以函数中用于参数的方式来实现。它的核心操作符只有七个操作符,这种简洁的定义,非常接近图灵机原型的纯函数式语言,是现代语言完全无法比拟的。相对其优点而言它的缺点也很明显——其运算效率十分低下。原始定义简洁的缺点使得大型开发工程变得困难。自底层到高层,自二维表查询到面向对象,使用者需要嵌入更多的函数来实现,致使LIPS众多方言的衍生。
所以综上所述,我认为,具体情况具体分析,合适的才是最好的。
什么是单向递归,尾递归?言简意赅即可?
尾递归:程序中只有一句递归语句,且在末尾。单向递归:指程序中的递归语句,在本程序操作执行前,都已经完成,如斐波那契数列。这样一来,共同的特点是在化非递归时都没有非要保存的分支路线