题目:有半美元、四分之一美元、10美分、5美分和1美分的硬币,将1美元换成零钱,一共有多少种不同方式?
思路:
首先我们把1美元变成100美分,半美元变成50美分,四分之一美元变成25美分。然后从硬币的最大面额
50美分开始:
100余额的所有换法 = 采用50美分的所有换法 + 不采用50美分的所有换法
那么,我们首先来看采用50美分的换法,既然采用了50美分,那么至少得用一个,换句话说,
我们就可以把问题转换为计算余额为100-50=50美分的所有换法:
100余额采用50美分的所有换法 = 50余额的所有换法
而:
50余额的所有换法 = 采用50美分的所有换法 + 不采用50美分的所有换法
这儿就递归到了采用50美分的所有换法,我们再次减去50美分时,余额为0,就代表有了一种换法,应该返回1;
这时,我们再返回余额为50时,不采用50美分的所有换法上面,那么,我们会取用除了50之外的最大面额25:
50余额不采用50美分的所有换法 = 采用25美分的所有换法 + 不采用25美分的所有换法
看着是不是很眼熟了呢?很明显,我们又可以进行递归了。
50余额采用25美分的所有换法 = 25余额的所有换法
而:
25余额的所有换法 = 采用25美分的所有换法 + 不采用25美分的所有换法
如上所述,我们可以发现,递归终止的条件有两个,一个是余额,另一个是硬币的数量。如果余额为0,则代表
有一种换法,返回1,余额为负,则代表这种换法不可行,返回0。硬币的数量为什么是递归的终止条件呢,因为
我们会不断根据当前余额去取在硬币集合中离当前余额面值最近的硬币,如果没有更多地硬币了,那么当然应该
终止递归。
程序如下:
user> (defn lq [x] ;定义硬币
(cond (= 1 x) 1
(= 2 x) 5
(= 3 x) 10
(= 4 x) 25
(= 5 x) 50))
user> (defn clq [a x] ;定义递归算法
(cond (zero? a) 1 ;如果余额为0,则说明有一种换法
(or (neg? a) (zero? x)) 0 ;如果余额为负或者已经取完硬币,则说明没有换法
:else (+ (clq a (dec x)) (clq (- a (lq x)) x))))
user> (clq 100 5) ;两个参数为要换的金额和最大硬币数量
292
分享到:
相关推荐
【Lacinia:纯Clojure实现的GraphQL解析器】 在当今的Web开发中,GraphQL作为一种强大的数据查询语言,已经越来越受到开发者的欢迎。它提供了一种高效、灵活的方式来获取API数据,允许客户端指定他们需要什么数据,...
[Pragmatic Bookshelf] 网络应用开发 (Clojure 实现) (英文版) [Pragmatic Bookshelf] Web Development with Clojure Build Bulletproof Web Apps with Less Code (E-Book) ☆ 图书概要:☆ If the usual ...
标题中的"Python-利用Clojure实现的一个可拖放的看板示例"表明这是一个结合了Python和Clojure技术的项目,旨在创建一个可交互式的看板应用,支持用户通过拖放操作来管理任务或信息。看板在项目管理和敏捷开发中广泛...
camel-snake-kebab, 用于字案转换的Clojure [Script] 库 camel-snake-kebab用于字案转换的Clojure [Script] 库。示例(use 'camel-snake-kebab.core)(->camelCase 'flux-capacitor);
这个文件可能是Storm的Clojure实现或相关工具,对于进行大规模实时数据处理的开发者来说很有价值。 综上所述,这个压缩包包含了一系列资源,可以帮助开发者深入理解Clojure语言,尤其是1.3.0版本及其后续演进。书籍...
在Clojure中实现遗传算法的框架是一个有趣且富有挑战性的任务,因为Clojure是一种功能编程语言,它提供了独特的视角和工具来处理这类问题。遗传算法(Genetic Algorithms, GA)是一种模拟自然选择和遗传学原理的优化...
- **机器学习基础**:介绍如何使用 Clojure 实现简单的机器学习算法,如线性回归、决策树等。 3. **实践篇**:通过具体的项目案例来巩固前面所学的知识。 - **文本分析**:使用自然语言处理技术进行文本挖掘,如...
这种性质使得Clojure代码能够操作自身,实现自我修改,增加了代码的灵活性。同时,Clojure提供了强大的映射(map)、序列(sequence)和集合(set)操作,以及高阶函数,如`map`、`filter`和`reduce`,这些都极大地...
clojurec, 在C 之上,一个Clojure实现 ClojureC这是面向的面向对象编程语言的编译器。 它基于 ClojureScript,并开始于ClojureScript提交 0e0aa7fdd379649bf87f8fff5c6a64e37fe616a4 社区和组织我们使用
- **Concurrency**:Clojure通过软件事务内存(Software Transactional Memory, STM)实现了安全和高效的并发处理。STM允许开发者以一种简单直观的方式处理并发问题,避免了传统锁机制带来的复杂性和潜在死锁问题。 ...
这是因为Clojure内部实现了高级别的并发抽象,例如软件事务内存(STM)和其他并发原语。 不可变性是Clojure中的另一个核心概念。在Clojure中,数据结构默认是不可变的,这意味着一旦创建了数据结构,就无法更改。这...
这个项目提供了一个Python接口,允许Python开发者像使用普通Python库一样调用Clojure实现的布隆过滤器。通过这个接口,开发者可以轻松地集成到现有的Python项目中,进行数据去重、缓存验证等操作。 5. **使用场景*...
《Clojure电子书》集合包含了三本关于Clojure编程的重要书籍和一个Leiningen的Windows安装程序,这对于学习和深入理解Clojure语言至关重要。Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,...
- **软件事务内存(STM)**: Clojure通过STM机制实现了高度并发的编程模型,它允许开发者以事务的方式更新共享状态,从而简化了并发编程的复杂度。 #### 六、学习资源与社区 - **官方文档**: Clojure官方网站提供了...
Clear, practical Clojure for the professional programmer Professional Clojure is the experienced developer's guide to functional programming using the Clojure language. Designed specifically to meet ...
Nginx-Clojure 是一个 Nginx 的模块,用于嵌入 Clojure 或者 Java 或者 Groovy 程序。 可以通过nginx-clojure实现JAVA扩展nginx的功能,如权限验证。
[2009] Programming Clojure.(Stuart Halloway).[1934356336].pdf [2010] Functional Programming with Clojure - Simple Concurrency on the JVM.(Tim Berglund, Matthew McCullough).[193650202X].pdf [2010] ...