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

clojure中的递归是无限的,并且不返回值

在Clojure中,递归是一种常见的编程技术,它允许函数在执行过程中调用自身。与其他编程语言不同,Clojure中的递归默认是无限的,并且不返回值。

这种设计是基于Clojure的惰性求值特性。在Clojure中,函数的返回值通常是一个惰性序列,它只在需要时才会被计算。当使用递归时,函数会生成一个无限的惰性序列,而不是返回一个具体的结果。

这种无限递归的特性在某些情况下非常有用。例如,当我们需要生成一个无限序列时,可以使用递归来定义序列的生成规则。由于惰性求值的特性,我们可以在需要时无限地访问这个序列,而不会导致无限循环或内存溢出的问题。

然而,由于递归是无限的且不返回值,我们需要在使用递归时小心处理终止条件。否则,递归将永远不会结束,导致程序无法正常执行。

在Clojure中,我们可以使用一些技巧来处理递归的终止条件。例如,我们可以使用条件判断语句(如if或when)来检查某个条件是否满足,如果满足则终止递归。另外,我们还可以使用一些内置函数(如take或take-while)来限制递归的次数或生成有限的序列。

总结起来,Clojure中的递归是无限的,并且不返回值。这种设计是基于Clojure的惰性求值特性,可以用于生成无限序列等场景。在使用递归时,我们需要小心处理终止条件,以避免无限循环或内存溢出的问题。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

2018-7-18pythoh函数参数,返回值,变量,和递归

***************************************************************                                  函数参数初级和返回值...: 基础: args:arguments  参数 kwargs:keyward arguments  关键字参数 形参前面加*指可变参数类型,实参前面加*解包参数 函数参数一共有7种类型分别是...,函数递归比循环消耗内存 在函数尽量定义局部变量 开发一个项目一般把项目分成三个部分,分别是: data.py(存放数据文件) tools.py(存放函数文件) main.py(存放函数执行文件...: 定义一个函数表示 一个行为 #在一个函数可以调用另一个函数,叫做函数相互调用 #在函数也可以调用自己叫做函数递归 #第一种:两个行为相互独立 # def movie(): #    ...#     snack() #admiad # def snack(): #     print("吃零食") # # movie() #函数递归就是函数调用执行自己,简单函数递归实例

2.1K40
  • 2023-05-01:给你一个整数 n , 请你在无限整数序列 找出返回

    2023-05-01:给你一个整数 n ,请你在无限整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...找出返回第 n 位上数字。...2.实现函数 findNthDigit,其输入为整数 n,表示要查找数字在整数序列位置。根据 under 数组,找到包含第 n 个数字区间长度 len,返回调用子函数 number 结果。...计算下一个节点路径 cur*(all/offset)+path,递归地调用 number 函数。...4.在 main 函数,定义一个整数变量 n 表示要查找数字在整数序列位置,调用 findNthDigit 函数查找第 n 个数字,输出结果。...时间复杂度和空间复杂度如下:1.findNthDigit 函数循环需要遍历数组 under,时间复杂度为 O(1) 平均时间复杂度为 O(log n);number 函数实现了一个递归结构,每次递归除去常数项时间复杂度为

    42200

    Clojure 运行原理之编译器剖析

    LispReader.java 一般来说,具有复杂语法编程语言会把词法分析与语法分析分开实现为 Lexer 与 Parser,但在 Lisp 家族,源程序语法就已经 AST 了,所以会把 Lexer...macroexpand Macro 毫无疑问 Lisp 屠龙刀,可以在编译时自动生成代码: static Object macroexpand(Object form) { Object...,form参数即是宏展开后各种数据结构(String/ISeq/IPersistentList 等),返回值类型为Expr,可以猜测出,Expr子类程序主体,遵循模块化编程风格,每个子类都知道如何对其自身求值...emit 这里需要明确一点Clojure 编译器并没有把 Clojure 代码转为相应 Java 代码,而是借助 bytecode 操作库 ASM 直接生成可运行在 JVM 上 bytecode...IPersistentVector ret = PersistentVector.EMPTY; for (int i = 0; i < args.count(); i++) // 这里递归求列表每项

    99930

    函数式编程那些事儿

    函数式编程一种编程范式,在其中它试图将每个函数都绑定到纯数学函数。这是一种声明式编程风格,着重于解决什么而不是如何解决。...Clojure,Common Lisp,Erlang,Haskell和Scala遵循函数式编程方法一些著名编程语言。...使用函数式编程风格编写代码时,有能力编译器将能够: 记住结果 并行运算 等待评估结果 递归 在函数式编程范例,没有for和while循环。相反,函数式编程语言依赖于递归进行迭代。...递归使用递归函数实现递归函数会重复调用自己,直到达到基本情况为止。 引用透明性 一旦在函数式编程语言中定义了变量,就不允许在程序执行期间更改它们持有的值。这称为引用透明性。...这些函数给定返回值与它们产生输出相同。纯函数参数和返回类型由其函数签名给出。

    86640

    Python进阶之递归算法详解

    递归(英语:Recursion),又译为递回,在数学与计算机科学指在函数定义中使用函数自身方法。...py def mark(): print(1) mark(n+1) #调用自己, 传递大1参数 调用mark()函数,传递参数3,代码执行过程: 会依次打印出...无限递归 无限递归,就是会一直重复、没有结束递归。 使用递归方式打印编号 py def fix(n): print(n) fix(n+1) fix(1) 从1开始,逐一增大。...如果想在递归中得到一个返回值,我们可以使用return语句返回结果。 递归结束条件 当满足一定条件时,递归函数不会再继续调用自己,那么这个条件就是递归结束条件。...没有递归结束条件,程序就不知道在哪里结束,会陷入无限递归中,最终导致程序报错 一个结束条件情况 py def func(n): if n == 1: return 6

    64410

    Clojure与LispClojure与Lisp

    3 递归 Lisp第一种支持递归函数高级语言。 4 变量动态类型 在Lisp语言中,所有变量实际上都是指针,所指向值有类型之分,而变量本身没有。...7 符号(symbol)类型 符号实际上一种指针,指向储存在哈希表字符串。...如今,在任何具备 Java 虚拟机地方,都可以使用 Lisp 强大功能。 Clojure 一种函数式编程语言 它囊括了函数式编程所有精华: 避免了不稳定状态、递归、更高阶函数等。...Clojure 还是一个动态类型语言 我们可以选择添加类型信息来提高代码关键路径性能。...Clojure 不仅可在 JVM 上运行,而且可以与Java无缝融合(JVM平台语言家族原则上都支持)互操作性。最后,Clojure 在设计上也考虑了并发性,具有并发编程一些独特特性。

    1.9K30

    函数式编程简介

    我们可以假设U为可证,那么可以推出PM矛盾(不相容);但是假设U不可证,却推导不出PM矛盾。U含义在PM不可证,而事实上,它被证明不可证,所以UPM不可证真命题。...和ML都是不纯编程语言,但是Haskellside effect free 函数一等公民 函数一等公民,指的是你可以将函数作为参数、返回值、数据结构存在,而且不仅可以用函数名引用,甚至可以匿名调用...纯函数和不可变性 纯函数指执行过程没有副作用函数,所谓副作用是说超出函数控制操作,比如在执行过程操作文件系统、数据库等外部资源。...比如Clojuremap高阶函数,它接收(fn [v] ...),把一组数据映射成另外一组数据。...xf定义了一种过程:filter出奇数取出前10个元素。

    1.7K41

    125. 精读《深度学习 - 函数式之美》

    2 概述与精读 深度学习机器学习基于人工神经网络模型一个分支,通过模拟多层神经元自编码神经网络,将特征逐步抽象化,这需要多维度、大数据量输入。...然而在生产环境,基于 性能和安全性 考虑,一般会使用函数式语言 Clojure 或 Haskell。 在生产环境,可能要并发出里几百万个参数,因此面临挑战:如何高效、安全执行这些运算。...Clojure 凭借 partition 对计算进行分区,采取分而治之对分区计算结果进行合并思路优化了并发性能。...无限数组,而 zip 函数将其整合为一个新数组 (1,2),(2,4),(3,6),(4,8)... 这也是无限数组,如果将 zip 函数执行完那么程序就会永远执行下去。...3 总结 本文介绍了为什么深度学习更适合使用函数式语言,以及介绍了 Clojure 与 Haskell 语言共性:安全性、高性能,以及各自独有的特性,证明了为何这两种语言更适合用在深度学习

    41610

    clojure基础入门(一)

    阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure一种运行在JVM上Lisp方言,属于函数式编程范式,它和java可以方便互相调用,这样开发程序可以很好结合java和clojure...欢迎进入clojure世界。  ? 变量 Clojure变量可以def关键字来声明:  ? clojure数据类型弱类型,对应javaobject,然后通过变量名直接调用。...函数式编程以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或宏,其后面的都会被当成参数,如上"hello world"被当成参数传入str函数进行输出。...这里有三层嵌套,首先(= age 18)来判断返回是否等于18,作为if判断该返回哪个字符串依据,再根据if确定字符串作为函数返回值。...注意if是不是函数或宏,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示值作为函数返回值

    1.5K30

    纯JS实现在一个字符串b查找另一个字符串a出现所有位置,并且不使用字符串方法(递归

    问题:判断字符串A在中所有出现字符串B(长度大于1)索引。...,我们可以把字符串转换成数组,使用递归函数不断去比对相应数组索引,然后把满足条件索引打印出来,其实很多现在前后端交互处理数据方法,用都是递归偏多,千万别小瞧递归!...if (num === arr.length-1) { console.log( '符合条件索引', i)...举个从小就听过例子:从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山...   其实递归,就是在运行过程调用自己。...实际上这张图就很形象地表达出了递归。 好了,递归知识差不多介绍完了。对了!简单来说,循环有去无回,而递归则是有去有回(因为存在终止条件)。

    1.2K20

    Java扩展Nginx之六:两大filter

    试试,还记得《Java扩展Nginx之一:你好,nginx-clojure》一文/java接口吗,那是个最简单helloworld级别的location,content handlerHelloHandler.java...,有个名为isLast入参,作用是标记当前调用是不是最后一次(true表示最后一次) doFilter方法返回值与之前NginxJavaRingHandler.invoke方法类似,个一维数组,...faced Java body filter) 当响应body二进制流时候,如果想对响应body做读写操作,nginx-clojure建议在body filter执行,这种body filter...方法类似,个一维数组,只有三个元素:status, headers, filtered_chunk,一旦status值不为空,nginx-clojure框架会用这次doFilter返回值作为最后一次调用...),这里有个重点注意地方:bodyChunk只在当前doFilter执行过程中有效,不要将bodyChunk保存下来用于其他地方(例如放入body filter成员变量) 继续看doFilter方法返回值

    52430

    递归和迭代

    :原问题必须可以分解成若干个子问题,而且子问题须与原始问题为同样事(相似),且规模更小 (2)递归归来:子问题演化必须有一个明确终点,否则可能导致无限递归(无终止条件循环),也就是说不能无限制地调用本身...,须有个出口,化简为非递归状况处理 5.递归在函数具体形式: (1)必须明确终止条件,给出终止时处理 (2)必须有间接或直接调用自身解决小规模问题步骤 def recursion(大规模问题)...(1)代换法 1.猜对答案 2.用数学归纳法求解常系数,验证递归式解正确性 例:已知: T(n)= O(n lgn) 则计算 : (2)递归树 (3)主方法:不是所有情况都包括...二.迭代 1.迭代:一种为了逼近所需目标或结果,不断用变量旧值递推新值过程 2.迭代在程序表现:函数不断调用原函数返回值, 3.迭代与循环,迭代和递归一样,也是循环一种 (1)循环...,但是迭代不一定有递归,大部分可以相互转换.能用迭代不用递归, 5.迭代在程序表示: (1)必须设置计数器,可以通过计数设置或条件设置,否则会一直迭代 (2)必须有返回值可以作为再次迭代初值

    68930

    Clojure 学习入门(19)—— 数组

    数组组件类型为type(如果指定了type),或aset第一个元素类型(如果aset不为空),或Object。aset中所有元素类型必须兼容数组组件类型。...需要注意类对象是必需。类对象可以通过导入或完全限定名称获得。type可以使用基本类型类对象,例如Integer/TYPE等。...aset aset (aset array idx val)  (aset array idx idx2 & idxv) 用指定元素替代数组索引位置上元素。...使用一个索引idx,和一个返回值ret,并将ret初始化为数组a克隆,然后将ret每一个元素应用于expr表达式,(用表达式返回值替换ret当前值)最后返回新ret数组。...使用一个索引idx,和一个返回值ret,将ret初始化为init,将ret设置为expr表达式每一步计算结果,最后返回ret。

    93540

    深入理解 Java 方法重载与递归应用

    另一个接受两个 double 型参数返回 double 型结果。 在 main 方法,我们分别调用了两个 add 方法打印了结果。 重载好处: 可以使代码更加简洁易读。...重载时需要注意返回值类型、访问权限、static 和 final 修饰符等限制。 Java 递归 递归 一种让函数调用自身技术。它提供了一种将复杂问题分解为简单问题方法,这样更容易解决。...理解递归 递归可能有点难以理解。理解它最好方法通过实验来了解它是如何工作递归示例 将两个数字相加很容易,但将一系列数字相加更复杂。...停止条件 就像循环可能陷入无限循环问题一样,递归函数可能陷入无限递归问题。无限递归指函数永远不停止调用自身。每个递归函数都应该有一个 停止条件,即函数停止调用自身条件。...停止条件示例 在前面的示例,停止条件参数 k 变为 0 时。 另一个停止条件示例 在这个例子,函数将在开始和结束之间一系列数字相加。

    16010

    Java扩展Nginx之五:五大handler(系列最核心)

    ,如题,本篇整个系列最核心内容,咱们写代码主要都集中在nginx-clojure定义五种handler,不同handler分别发挥着各自作用,它们: Initialization Handler...配置一个location,您可以根据自己业务情况来决定返回值 String myhost = scheme + "://127.0.0.1:" + serverPort + "/contentdemo...,下图刚才写MyRewriteProxyPassHandler.java源码,注意红框位置,invoke方法返回值,如果返回不是PHASE_DONE,nginx-clojure框架就不再执行后面...Handler(日志输出) 最后一个handler作为辅助作用日志输出,尽管在其他handler,我们可以直接调用NginxClojureRT.log方法将日志输出到error.log文件,但还是可以猜出官方定义...有专用配置属性log_handler_property invoke方法返回值无意义,会被nginx-clojure忽略 接下来通过实例学习log handler,找到前面的content handler

    38750

    通过例子学递归

    耳熟能详例子 生活,有不少递归例子,我们学习递归时候,要善于把生活例子转化为编程语言实现。这样既锻炼了编程思维,又加深了自己对于概念理解。...递归一把双刃剑。...而 Python 也对递归层数有所限制,并且不支持尾递归优化。 但是使用递归可以快速解决问题,尤其一些对资源要求不是很大问题。递归也可以帮我们梳理思路,然后再使用循环重写递归。...12 元时候,递归就应该停止,返回可能组合方式。...然后调用自身,判断是否满足停止条件。如果不满足,会继续从 currency 取出一张纸币,执行上述操作。如果满足停止条件,程序就会回到上一层继续执行,我们就可以得到 result 值。

    69910
    领券