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

基本LISP递归,枚举大于3的值

基本LISP递归是指在LISP编程语言中,使用递归函数来实现基本的计算和操作。LISP是一种函数式编程语言,其语法简洁,易于编写和阅读。递归是LISP编程中的一种常见编程技巧,可以用来解决许多问题,例如计算阶乘、斐波那契数列等。

在LISP中,递归函数通常由两个部分组成:基本情况(base case)和递归情况(recursive case)。基本情况是指当输入满足某个特定条件时,函数将直接返回一个值,而不再进行递归调用。递归情况是指当输入不满足基本情况时,函数将调用自身来解决问题。

以下是一个简单的LISP递归函数,用于计算大于3的值的阶乘:

代码语言:txt
复制
(defun factorial (n)
  (if (<= n 3)
      (cond ((= n 0) 1)
            ((= n 1) 1)
            ((= n 2) 2)
            ((= n 3) 6))
      (* n (factorial (- n 1)))))

在这个函数中,我们首先检查输入的值是否小于等于3,如果是,则使用cond条件表达式来计算阶乘。如果输入的值大于3,则使用递归情况,将输入值乘以函数自身的值减1的阶乘。

总之,基本LISP递归是一种在LISP编程语言中实现计算和操作的有效方法,可以用来解决许多问题,包括计算阶乘、斐波那契数列等。

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

相关·内容

递归算法:计算1+2+3+……+n

args) { int test = test(10); System.out.println(test); } } 测试结果: 55 要理解该算法,需要先懂递归...很多人只知道递归是自己调用自己,却并不明白自己调用自己变量作用域关系,其实每一次调用自己它变量都是独立,是互不影响,如果你实在理解不了,就把这所有递归次数,每一次调用都当成不是在调用自己,而是另一个独立方法...比如我们可以把上面的test()方法,写成10个test()方法,用1,2,3……10来区分,然后将上面的代码写成一个循环,没一次循环调用不同方法,执行相同逻辑,能得到相同结果,这样有助于自己对递归理解...其实递归真的没那么难,你觉得难可能是一种心理障碍,没有去思索它,缺乏了探索精神而已。...你只需要把每一次递归都当成调用了一次方法,这个方法得到了一个返回结果,这个结果接着又调用了一个跟自己一样逻辑方法,继续参与了运算,如果反复往返罢了!

2.8K30

--03:控制流

比如SICP中用Lisp方言Scheme就运用前缀语法: (+ 1 3 4 6) //用数学表示就是1+3+4+6 (* (+ 1 7) 8) //(1+7)*8 前缀有2点好处:1参数可任意多个...3.顺序复合(Sequencing) 我觉得这个翻译有点不恰当(顺序复合),我们直接叫顺序就是了,也就是按照语句先后顺序来执行意思。 这是最基本控制流程,也是命令式语言核心。...在Common Lisp中,程序员可以选择返回第一个、第二个或者最后一个元素。当然,除非那些不提供返回子表达式有副作用,否则这种复合语句在纯函数式编程语言中是没有任何作用。...对于上面的例子,我们可能认为在循环正常结束时i是11(也就是第一个大于设定最大10整数),可惜是如果这个最大不是10,而是整数最大,那么它再+1则导致算术溢出。...然而一个“优化”编译器(通常是专门为函数式语言设计编译器),常常能对递归函数生成优异代码,如上面的gcd尾递归(尾递归函数是指在递归调用之后再无其他计算函数,其返回就是递归调用返回)。

2K100
  • 日拱一卒,伯克利CS61A,居然有Lisp这样语言……

    这一次作业使用Lisp一个方言版本——scheme,简单介绍一点作业当中会用到语法。 语法 基本运算 Lisp最大特点就是它代码表示形式,和常规语言完全不同。...要求list中最后一个pair第二个必须是nil,否则也不会报错,但是输出时候会多输出一个.作为区分。 比如一个正常list是这样,我们遵守了规定,最后一个元素第二个是nil。...除此之外,单引号还能表示一个list: '(1 2 3 4)`就相当于Python当中`[1, 2, 3, 4] 好了,我们简单介绍了一下lisp语法,可以来做作业了。...来判断奇数 这是一个经典递归过程,如果不熟悉可以先写成Python代码,再转换成Lisp。...1 2 3 3 4 这是一个不下降list,而下面这个不是: 1 2 3 3 2 也是简单递归,判断(car s)和(cadr s)是否存在,如果存在判断(car s) > (cadr s),如果为真

    96740

    3. Vue 模板渲染:插表达式、v-text、v-html基本使用

    这个基础功能在前端框架可是很重要功能,不单单「Vue框架」有此功能,在Django框架等后台都有「模板渲染」功能,而且写法基本上也是差不多。 那么这个「模板渲染」是干啥?...本章节渲染方式介绍: 插表达式 v-text v-html 以下是基本使用方式 基本使用方式 「插表达式」 {{ msg }} 「v-text」 ...对于插表达式网络延迟问题,上一章节使用 v-cloak 控制样式即可解决。 下面的示例来看看三者区别表现。 <!...主要原因是「插表达式」可以拼接html元素内容,而「v-text」和「v-html」只能将提供数据渲染到html元素中,覆盖html内已有的内容信息。...区别3:插表单式和v-text都会转义,v-html则可以渲染html元素 将需要渲染信息设置为「h1」标签,下面来看看渲染效果,如下:

    1.7K10

    入门任意一种编程语言所必须几道习题

    Java、Scala、Ruby、Lisp(Common Lisp、Scheme、Clojure)、Prolog、Haskell等。...这个基本上是学习所有语言时候学习递归必然要接触例子,实现了这个,也基本上对所学习语言递归有了初步了解。   ...也就是先把最上面n-1个盘从1号柱移动到3号柱,再把最大盘从1号柱移动到2号柱,最后把最3号柱n-1个盘移动到2号柱,   于是就达到了递归效果。...2.如果周围有生命格子数目大于3,则下一代这个格子为无生命(解释为周围生命太多,资源消耗厉害)。   3.如果周围有生命格子数目等于2,则下一代这个格子状态继续保持当前状态。   ...如果Scheme、Common Lisp、Clojure这几种Lisp先后学习,也可以结合在一起,对比着学,想想另外一种是如何实现

    71720

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

    /a.out 10000000000000000 10000000000000000   立即得到我们想要而没有发生崩栈 20000000000000000   看来……不对,1亿亿次迭代瞬间完成...RESET   因为没有尾递归优化规定,所以对于那种无限循环,Common Lisp只能选择迭代才能保证不崩栈,比如使用do。...但是似乎也改变了Lisp味道,do显然此处只能在设计编译器、解释器时候就得单独实现,虽然按理Lisp下这些都应该是宏,但是无论用宏如何将函数式编程映射为显示迭代,因为尾clisp递归优化不支持,则无法和系统提供...Haskell不亏是号称纯函数式编程,尾递归优化无条件支持。 Prolog   本不想测prolog,因为首先它并没有所谓函数,靠是谓词演化来计算,推理上优化是其基本需求。...看来,至少参考了Scheme递归优化。 Ruby   Ruby作者松本行弘也是Lisp粉丝,当然,我想大多数编程语言作者都会是Lisp粉丝,因为它会给人很多启发。

    2.7K20

    Clojure与LispClojure与Lisp

    可是,IBM旗下Fortran表处理语言却未能支援符号运算递归、条件表达式、动态存储分配及隐式回收等功能。...3 递归 Lisp是第一种支持递归函数高级语言。 4 变量动态类型 在Lisp语言中,所有变量实际上都是指针,所指向有类型之分,而变量本身没有。...复制变量就相当于复制指针,而不是复制它们指向数据。 5 垃圾回收机制 6 程序由表达式(expression)组成 Lisp程序是一些表达式区块集合,每个表达式都返回一个。...在其他语言中,这种形式只是经过解析在后台产生,但是Lisp直接采用它作为表达形式。它由列表构成,而列表则是Lisp基本数据结构。 用一门语言自己数据结构来表达该语言,这被证明是非常强大功能。...如今,在任何具备 Java 虚拟机地方,都可以使用 Lisp 强大功能。 Clojure 是一种函数式编程语言 它囊括了函数式编程所有精华: 避免了不稳定状态、递归、更高阶函数等。

    1.9K30

    【翻译】Rust中递归优化故事

    seanchen1991/the-story-of-tail-call-optimizations-in-rust-35hf 我认为尾调用优化(tail call optimizations)相当整洁,特别是它们解决递归函数如何调用这类基本问题方式...诸如Haskell和Lisp家族这类函数式语言,以及逻辑语言(Prolog可能是最著名例子)都强调采用递归方式思考问题。这些语言通过尾调用优化可以在性能上获得许多好处。...StackOverflow[3]上有个关于尾递归概念详细解释。 随着最近几年编程社区强调函数范式和函数式风格趋势,您可能会认为尾调用优化已经出现在许多编译器/解释器实现中。...enum BorrowRec { Ret(T), Call(Thunk>), } BorrowRec枚举表示一个尾递归函数调用在任意时刻可能处于两种状态...另外,当递归函数到达带有最终计算出Ret状态时,最终会通过rec_ret!宏来返回。 这是TCO吗? 所以,这样对吗?

    1.9K20

    至少有 K 个重复字符最长子串----双指针篇5,滑动窗口篇4,新人理解递归必看篇!!

    递归基本是记住递归函数含义(务必牢记函数定义):本题 longestSubstring(s, k) 函数表示就是题意,即求一个最长子字符串长度,该子字符串中每个字符出现次数都最少为 k。...未进入递归返回结果:如果 s 中每个字符出现次数都大于 k 次,那么 s 就是我们要求字符串,直接返回该字符串长度。 总之,通过上面的分析,我们看出了:我们不是为了递归递归。...(枚举)出答案所包含字符数量的话,这里双指针是不具有单调性。...然后遍历 26 种可能性(答案所包含字符种类数量),对每种可能性应用滑动窗口(由上述性质确保正确),可以得到每种可能性最大(局部最优),由所有可能性最大可以得出答案(全局最优)。...因为数值小其实是代表了「可枚举」,往往是解题或者降低复杂度一个重要(甚至是唯一)突破口。

    65520

    Scheme语言实例入门--怎样写一个“新型冠状病毒感染风险检测程序” 1,表达式2,原子3,表(list) 4,点对(pair)5,向量(vector)6,变量7,

    想到这里,唯一满足要求就是Lisp语言了,它简单到只有3种最基本数据结构:原子、表和字符串;只有一种语法,就是符号表达式,数据和函数都是采用符号表达式定义,这种符号表达式称为S一表达式,它是原予和表总称...,它在某种意义上可以理解为C中枚举类型。...这就是Lisp 表示法一个美丽地方是:它是如此简单! 3,表(list) 表是由多个相同或不同数据连续组成数据类型,它是编程中最常用复合数据类型之一,很多过程操作都与它相关。...la 3) ; 取得列表第3(从0开始) 4 > (list-set!...要改善递归效率,可以将递归过程修改为尾递归,Scheme语言规范规定尾递归将在语言内部优化为循环结构。有关尾递归概念这里不再详细介绍。

    1.5K20

    【一天一大 lee】四数之和 (难度:中等) - Day20201005

    题目:[1] 给定一个包含 n 个整数数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 与...满足要求四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ] 抛砖引玉 思路 本题可以算作求:满足指定条件子集 求子集问题可以使用递归回溯处理...超时 递归回溯逻辑超时(282/283)那换种方法尝试一下 排序 + 双指针 求子集和题目之前还做过:三数之和[3] 三数和时:先确定一个数,然后采用双指针来枚举其他两个数 那么本题可以先确定一个数...,然后直接套用三数和逻辑枚举其他三个数 注意: 枚举前两个元素时相同元素只确定最后一个相同元素 最近四个数和小于 target 则说明本轮确定太小可以继续向后确定 最近四个数和大于 target...则说明本轮确定太大后面的组合都会大于 target var fourSum = function(nums, target) { let _result = [], len = nums.length

    30931

    可爱 Python:Python 中函数编程

    递归用作主要控制结构。在某些语言中,不存在其它“循环”构造。 重点集中在列表 LISt 处理(例如,名称 Lisp)。列表经常和子列表递归一起使用以替代循环。 “纯”函数语言能够避免副作用。...虽然列表内涵没有添加什么新能力,但它们使许多旧能力看起来好了 许多。  Python 中 FP 基本元素是函数 map()、reduce() 和 filter(),以及运算符 lambda。...虽然实际上消除程序中所有流控制命令可能只对加入“混乱 Python”竞争(与看上去非常象 Lisp 代码)有用,但是理解 FP 是如何使用函数和递归来表示流控制是值得。 ...I/O、循环和条件语句小程序表示成一个带有递归纯表达式(实际上,如果需要,可以表示成能传递到任何其它地方函数对象)。...让我们看一段相当普通命令代码。它目的是打印出乘积大于 25 几对数字列表。组成各对数字本身是从另外两个列表中挑选出。这种操作与程序员在他们程序段中实际执行操作差不多。

    90520

    SCIP学习笔记

    引言 SCIP(Structure and Interpretation of Computer Programs)[1]是MIT自1984年起编程入门教程,尽管最近他们用Python课程取代了Lisp...Lisp基本语法 Lisp原始定义在John McCarthy1960发表论文[3]。 Lisp[4]是一个语言族,包括Common Lisp和Scheme,二者区别见[5]。...) 以上是Scheme主要语法,可以容易而优雅地生成语法树,没有语法糖。那么递归和迭代怎么用?使用上面的语法规则即可。...; ; 3 以上是Lisp主要语法规则,非常简练。...构造数据抽象 闭包 (这里指不是匿名函数) 是在处理符合数据中一个关键思想:用于组合数据对象粘合剂,不但能用于组合基本数据对象,同样也可以用复合数据对象。

    1.6K40

    函数式编程初探

    不仅最古老函数式语言Lisp重获青春,而且新函数式语言层出不穷,比如Erlang、clojure、Scala、F#等等。...就连最基本问题"什么是函数式编程",网上都搜不到易懂回答。 下面是我"函数式编程"学习笔记,分享出来,与大家一起探讨。...因此,不修改变量,也是它一个重要特点。 在其他类型语言中,变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中。函数式编程使用参数保存状态,最好例子就是递归。...如果程序员每天所写代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"...).multiply(3).subtract(4) 这基本就是自然语言表达了。

    80760

    一天一大 leet(整数拆分)难度:中等-Day20200730

    示例2 输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36 说明: 你可以假设 n 不小于 2 且不大于 58 返回它最大深度 3 。 抛砖引玉 ?...思路 拆成 n 个数,n 不固定 这种类型题目:规则确定,起始条件不确定 动态规划 递归 ---- 动态规划 枚举 n,dp 记录不同 n 结果,dp[n]即查询结果: 确定拆分整数个数:2<=...i<=n dp[i]为 i 拆分整数乘积最大 拆分两个以上j,dp[i - j] -> dp[i - j]拆分两个即以上子集 拆分两个j,i-j /** * @param {number} n...Math.max(curMax, Math.max(j * (i - j), j * dp[i - j])) } dp[i] = curMax } return dp[n] ---- 递归...参数,要拆分整数 终止条件:遇到已经拆分过数组 递归逻辑基本和动态规划一致: 拆分一个数字j出来 属于i-j可以独立作为一个数字,也可以继续拆分 /** * @param {number}

    33420

    人工智能学习笔记

    专家系统具有如下一些特点: 1)知识汇聚 2)启发性推理 3)推理和解释透明性 4)知识更新 典型专家系统模型如图: LISP 1959年,麦卡锡基于阿隆索.邱奇(...LISP语言特点 a、计算用是符号表达式而不是数; b、具有表处理能力,即用链表形式表示所有的数据; c、控制结构基于函数复合,以形成更复杂函数; d、用递归作为描述问题和过程方法...; e、用LISP语言书写EVAL函数既可作为LISP语言解 释程序,又可以作为语言本身形式定义;f、程序本身也同所有其他数据一样用表结构形式表示。...LISP符合表达式 ①符号:以字母开头不含规定特殊字符字符串,相当于其他语言中变量。 ②原子:LISP中不可再分割对象,如数、符号、空表。...LISP语言基本函数 1)数值运算函数 2)求值与赋值函数 3)表处理函数 4)逻辑函数 5)条件函数 6)自定义函数和无名函数 专家系统实例 专家系统主要表现在以下两个方面:

    48630

    函数式编程初探

    不仅最古老函数式语言Lisp重获青春,而且新函数式语言层出不穷,比如Erlang、clojure、Scala、F#等等。...就连最基本问题"什么是函数式编程",网上都搜不到易懂回答。 下面是我"函数式编程"学习笔记,分享出来,与大家一起探讨。...函数式编程使用参数保存状态,最好例子就是递归。下面的代码是一个将字符串逆序排列函数,它演示了不同参数如何决定了运算所处"状态"。   ...如果程序员每天所写代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"...(3).subtract(4) 这基本就是自然语言表达了。

    654100
    领券