`
JohnnyJian
  • 浏览: 106057 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy学习笔记——闭包的递归调用

阅读更多
如果一个闭包被赋值给一个对象的属性(在脚本中,给一个没有定义过的变量赋值,实际上就是给这个脚本对象添加了一个属性),那么当需要对这个闭包进行递归调用的时候,可以直接使用这个属性的名字进行调用:
// 递归求n!
factorialProperty = { n ->
    if (n == 0) return 1
    n * factorialProperty(n - 1) // 使用这个属性的名字进行递归调用
}
assert 3628800 == factorialProperty(10)

如果把闭包赋值给一个局部变量,那么就必须先定义这个变量,再进行赋值:
def factorialVar // 先定义
factorialVar = { n -> // 再赋值
    if (n == 0) return 1
    n * factorialVar(n - 1) // 使用这个局部变量的名字进行递归调用
}
assert 3628800 == factorialVar(10)

但是,如果要在定义局部变量的同时,用闭包初始化这个变量,那么就没有办法使用上面的方法了。这是因为这个闭包先于这个局部变量被定义,所以在这个闭包被定义的时候,在它的上下文中并没有这个局部变量。
在这种情况下,可以通过Closure的call方法实现递归调用:
def factorialVar = { n ->
    if (n == 0) return 1
    n * call(n - 1) // 使用call方法实现递归调用
//    n * factorialVar(n - 1) // 错误
}
assert 3628800 == factorialVar(10)

call方法同样可以用于匿名闭包:
assert 3628800 == { n -> n == 0 ? 1 : n * call(n - 1) }(10)

事实上,call方法可以用在任何闭包的递归调用上。

以上代码在Groovy 1.5.7中测试通过。
分享到:
评论

相关推荐

    Groovy学习笔记 PDF版

    在《Groovy学习笔记》这本书中,你可能会学到如何快速入门Groovy,理解其基本语法,包括变量、控制流、类和对象的创建,以及如何利用Groovy的特性来提高开发效率。此外,书中可能还会涵盖Groovy在实际项目中的应用,...

    Java JDK 6学习笔记——ppt简体版.rar

    这份"Java JDK 6学习笔记——ppt简体版"提供了关于这个关键版本的详细教程,适合初学者和有一定经验的开发者来深入理解Java编程。 首先,我们要了解Java JDK是什么。Java Development Kit,简称JDK,是Oracle公司...

    Java JDK 6学习笔记——ppt简体版附课本代码

    这份“Java JDK 6学习笔记——ppt简体版”涵盖了Java语言的核心概念、语法特性以及JDK 6的新功能,旨在帮助初学者和有经验的开发者深入理解并掌握这一版本的Java开发环境。 首先,Java JDK 6的安装与配置是学习的...

    Groovy轻松入门——Grails实战基础篇

    ### Groovy轻松入门——Grails实战基础篇 #### 搭建Grails环境及创建Grails Demo程序 **Groovy**是一种面向对象的编程语言,它运行于Java平台上,能够与Java代码无缝集成。而**Grails**则是一款基于Groovy的高性能...

    Groovy 学习笔记

    2. **Java集合增强**: Groovy提供了对Java集合的增强,如列表和映射可以使用链式调用、闭包操作等。 3. **使用Java库**: Groovy可以无缝调用Java的API和库,使得已有的Java资源可以轻松复用。 **三、Grails框架** ...

    Groovy学习笔记.pdf

    Groovy是一种动态、灵活的编程语言,它是Java平台上的一个主要补充,特别是在脚本编写和快速原型设计方面表现突出。...这份"Groovy学习笔记.pdf"应该会提供一个良好的起点,帮助你踏上Groovy的学习之旅。

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    Groovy学习笔记

    ### Groovy学习笔记知识点梳理 #### 一、Groovy简介 - **概念**:Groovy是一种灵活的脚本语言,其设计初衷是为了更好地服务于Java开发者。它具备许多现代动态语言的特点,比如Python和Ruby,同时又能够无缝地与Java...

    Java JDK 6学习笔记——ppt简体版

    本篇学习笔记将围绕Java JDK 6的关键特性、语法改进、API更新以及开发实践进行详细讲解。 1. **Java JDK 6概述** - JDK(Java Development Kit)是Java开发的核心组件,包含了Java运行环境(JRE)、编译器(javac...

    groovy学习笔记

    以下是对Groovy学习笔记各章节的详细解释: ### 第1章:数字和字符串 在Groovy中,所有的数字都是Object类型的,这意味着你可以在对象上调用方法。例如,你可以直接在数字上使用加减乘除等运算符,如`12 + 8`。...

    Groovy学习笔记 Struts2集成--Groovy类作为Action

    通过阅读文章《Groovy学习笔记 Struts2集成--Groovy类作为Action》,你可以更深入地了解如何在实际项目中利用Groovy的特性来优化Struts2应用。提供的压缩包文件`struts2-groovy-plugin`可能包含了Struts2 Groovy插件...

    groovy(10)-闭包委托策略1

    总结来说,Groovy的闭包委托策略允许我们灵活地控制代码执行的上下文,以及方法的调用路径,这对于编写简洁、可复用的代码非常有帮助。在实际编程中,熟练掌握`this`, `owner`, 和 `delegate`的用法,能够极大地提升...

    gradle学习笔记简书1

    Gradle 学习笔记简书1 本文档将对 Gradle 的基本命令、Groovy 语言基础和闭包委托进行详细的讲解。 Gradle 命令 ------------ ### 1. 生成 Wrapper 使用 `gradle wrapper` 命令可以生成 Wrapper。 ### 2. 打印...

    Groovy 学习资料

    Groovy可以直接调用Java的API,与Java代码无缝集成,同时提供了许多动态语言的特性,如闭包、元编程等。 2. **Groovy语法** - **简洁性**:Groovy的语法比Java更简洁,例如,可以省略分号和大括号。 - **动态类型...

    groovy编写webservice服务端和客户端(含连接数据并输出JSON数据)

    标题中的“groovy编写webservice服务端和客户端(含连接数据并输出JSON数据)”表明了本文将...以上是对标题和描述中提及的知识点的详细解释,通过学习和实践这些内容,开发者可以掌握使用Groovy构建Web服务的完整流程。

    Groovy need not rails——介绍自己写的一个基于groovy的框架,Webx

    通过深入学习和使用Webx,开发者可以充分利用Groovy的灵活性和生产力优势,同时享受到类似Rails的开发体验,而不必受限于Ruby语言。由于与Java平台的紧密集成,Webx还能够利用丰富的Java生态系统,为大型企业级应用...

    groovy 学习gradle学习经典手册

    3. **闭包**:学习Groovy中的闭包概念,它是函数式编程的核心,常用于回调、迭代和并行处理。 4. **元编程**:理解Groovy如何通过元对象协议(Meta Object Protocol, MOP)提供元编程能力,允许在运行时动态修改类和...

    Java调用Groovy,实时动态加载数据库groovy脚本

    本文将详细讲解如何在Java应用程序中调用Groovy脚本,实现从MongoDB数据库中读取并实时运行Groovy脚本,以及其背后的原理和优势。 首先,Groovy是一种与Java高度兼容的脚本语言,它可以无缝地与Java代码集成,共享...

Global site tag (gtag.js) - Google Analytics