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

基本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.9K30

--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),如果为真

    98740

    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.8K10

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

    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先后学习,也可以结合在一起,对比着学,想想另外一种是如何实现的。

    73820

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

    /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吗? 所以,这样对吗?

    2K20

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

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

    68920

    【算法解题思想】动态规划+深度优先搜索(CC++)

    基本步骤: DFS通常使用递归或栈来实现。以下是DFS的基本步骤: 选择起始点:选择图中的一个点作为起始点。 访问节点:标记起始节点为已访问,并将该节点加入递归或栈中。...例如,N=3,K=2,如果面值分别为 1 分、4 分,则在 1∼6 分之间的每一个邮资值都能得到(当然还有 8 分、9 分和 12 分);如果面值分别为 1 分、3 分,则在 1∼7 分之间的每一个邮资值都能得到...可以验证当 N=3,K=2 时,7 分就是可以得到的连续的邮资最大值,MAX=7,面值分别为 1 分、3 分。 输入格式 2 个整数,代表 N,K。 输出格式 输出共 2 行。...输入输出样例 输入 #1 3 2 输出 #1 1 3 MAX=7 解题思路: 此题主要利用了dp+dfs,根据题目来看需要k种邮票,那么需要哪几种邮票,这就需要枚举,dfs去每一步搜索,题目中要求最大连续长度...那么我们重新顺一下解题思路,首先枚举这k种邮票面值组合,我们解决办法是最简单的dfs,我们枚举出这k种面值组合,对它进行求解最大连续长度,处理办法是dp,具体解释注释在代码上。

    14110

    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

    可爱的 Python:Python 中的函数编程

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

    91620

    【一天一大 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

    31531

    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) 这基本就是自然语言的表达了。

    81860

    人工智能学习笔记

    专家系统具有如下的一些特点: 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)自定义函数和无名函数 专家系统实例 专家系统主要表现在以下两个方面:

    49430

    一天一大 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}

    34120
    领券