sicp的习题3.22,也就是以消息传递的风格重新实现队列,我的解答如下:
(define (make-queue)
(let ((front-ptr '())
(rear-ptr '()))
(define (set-front-ptr! ptr) (set! front-ptr ptr))
(define (set-rear-ptr! ptr) (set! rear-ptr ptr))
(define (empty-queue?) (null? front-ptr))
(define (front-queue)
(if (empty-queue?)
(error "FRONT called with an empty queue")
(car front-ptr)))
(define (insert-queue! item)
(let ((new-pair (cons item '())))
(cond ((empty-queue?)
(set-front-ptr! new-pair)
(set-rear-ptr! new-pair))
(else
(set-cdr! rear-ptr new-pair)
(set-rear-ptr! new-pair)))))
(define (delete-queue!)
(cond ((empty-queue?)
(error "DELETE! called with an empty queue" queue))
(else
(set-front-ptr! (cdr front-ptr)))))
(define (dispatch m)
(cond ((eq? m 'front-queue) (front-queue))
((eq? m 'empty-queue?) (empty-queue?))
((eq? m 'insert-queue!) insert-queue!)
((eq? m 'delete-queue!) delete-queue!)
(else
(error "Unknow method" m))))
dispatch))
(define (front-queue z) (z 'front-queue))
(define (empty-queue? z) (z 'empty-queue?))
(define (insert-queue! z item) ((z 'insert-queue!) item))
(define (delete-queue! z) ((z 'delete-queue!)))
由此,我才知道自己竟然一直没有想到,scheme完全可以模拟单向循环链表,整整第三章都在讲引入赋值带来的影响,而我却视而不见。在引入了改变函数
后,数据对象已经具有OO的性质,模拟链表、队列、table都变的易如反掌。首先,模拟节点对象,节点是一个序对,包括当前节点编号和下一个节点:
(define (make-node n next) (cons n next))
(define (set-next-node! node next) (set-cdr! node next))
(define (set-node-number! node n) (set-car! node n))
(define (get-number node) (car node))
(define (get-next-node node) (cdr node))
有了节点,实现了下单向循环链表:
(define (make-cycle-list n)
(let ((head (make-node 1 '())))
(define (make-list current i)
(let ((next-node (make-node (+ i 1) '())))
(cond ((= i n) current)
(else
(set-next-node! current next-node)
(make-list next-node (+ i 1))))))
(set-next-node! (make-list head 1) head)
head))
make-cycle-list生成一个有N个元素的环形链表,比如(make-cycle-list 8)的结果如下
#0=(1 2 3 4 5 6 7 8 . #0#)
Drscheme的输出形象地展示了这是一个循环的链表。那么约瑟夫环的问题就简单了:
(define (josephus-cycle n m)
(let ((head (make-cycle-list n)))
(define (josephus-iter prev current i)
(let ((next-node (get-next-node current)))
(cond ((eq? next-node current) (get-number current))
((= 1 i)
(set-next-node! prev next-node)
(josephus-iter prev next-node m))
(else
(josephus-iter current next-node (- i 1))))))
(josephus-iter head head m)))
从head节点开始计数,每到m,就将当前节点删除(通过将前一个节点的next-node设置为current的下一个节点),最后剩下的节点的编号就是答案。
分享到:
相关推荐
对比C++和Java,它们属于面向对象的编程语言,解决问题的方式略有不同。在C++中,我们可能需要定义一个类来表示棋盘状态,然后使用对象实例来存储当前的皇后位置。通过重载运算符来检查冲突,并使用迭代或递归的方式...
解决"ERR_UNKNOWN_URL_SCHEME"的问题通常涉及以下几个步骤: 1. **检查URL格式**:确保URL的协议部分(如http://或https://)是正确的,并且被WebView支持。 2. **自定义WebViewClient**:覆盖`...
在移动应用开发中,"scheme"是一种常见的机制,用于实现应用程序间的交互,即从一个应用启动另一个应用。本文将深入探讨scheme如何实现唤醒外部APP,以及它在Webview和浏览器环境中的应用。 首先,理解scheme的基本...
收集的用scheme语言编写的八皇后的解法,对学习scheme语言想理解递归的同志们是一个好例子,sicp中也有此练习题。
在FLUENT软件中,UDF(User Defined Functions)和Scheme编程是两种强大的工具,用于扩展其内置功能,解决复杂的流体动力学问题。本主题主要关注如何利用这两种技术进行混合编程,以模拟蓄热式熔铝炉的工作过程,包括...
书中还探讨了Scheme语言的深层次应用,例如语法扩展(Syntactic Extension)的概念,这允许程序员定义新的语法形式,以更接近问题领域的方式编写程序。还有对象操作中的各个特定数据类型的详细介绍和处理方法,这些...
以二维list格式输入九宫格问题,用scheme函数式程序设计语言求解,对于多个解的九宫格,可以得到所有的解
抓取scheme协议.js
- **实践项目**:通过实际编写代码解决具体问题来加深理解。 - **社区参与**:加入Scheme编程社区,与其他开发者交流经验。 - **书籍推荐**:除了《Simply Scheme》之外,《Structure and Interpretation of ...
- **设计**:设计是创造艺术的核心,涉及到如何有效地解决问题和构建程序。 - **抽象**:找到共同之处并忽略不必要的细节是抽象的关键。在编程中,这通常意味着通过定义通用的接口来处理复杂的数据结构或算法。 - **...
YSAT教程可能会涵盖如何高效地使用Scheme解决问题,包括优化算法、利用高阶函数和宏、以及编写清晰可读的函数式代码。 **环境与过程** 在Scheme中,过程是具有局部作用域的函数,而环境则是存储变量及其值的结构。...
Fluent Scheme 是一种基于 Scheme 语言的编程环境,旨在提供一个高效、灵活的解决方案 для scientific computing 和数据分析。以下是 Fluent Scheme 中文手册修订的知识点摘要: 1. Fluent Scheme 简介 Fluent ...
在Android应用开发中,"Scheme跳转"是一种重要的交互方式,允许不同的应用程序之间进行通信和数据交换。"Scheme"在Android系统中扮演着URL协议的角色,类似于网页浏览器中的http或https,但它是专为Android应用设计...
在Scheme中,函数可以调用自身,这种能力使得解决复杂问题变得简洁且易于理解。学习Scheme时,你需要理解如何设计和使用递归函数,以及如何处理递归的终止条件。 其次,Scheme采用了一种叫做“读-求值-打印循环”...
URL Scheme是一种在应用程序之间建立通信桥梁的技术,它允许一个应用通过特定的协议(即自定义的URL模式)启动另一个应用,并传递数据。在iOS和Android等操作系统中,开发者可以利用URL Scheme实现应用间的深度链接...
- **简洁性**:Scheme语言以其简洁著称,允许程序员将更多的精力集中在解决实际问题上,而不是语言本身。 - **灵活性**:Scheme不仅可以用作脚本语言,还可以作为应用程序的扩展语言。 - **元语言特性**:Scheme...
抖音快手URL Scheme 里面包含了抖音快手,进入直播间,进入用户,hone,等 手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app...
- **递归(Recursion)**:由于函数式编程的特点,递归在Scheme中扮演着重要角色,用于解决问题和定义复杂数据结构。 - **模式匹配(Pattern Matching)**:虽然Scheme标准并不直接支持模式匹配,但许多实现提供了...
合理管理变量有助于避免命名冲突等问题。 - **列表(Lists)**:列表是Scheme中非常重要的数据结构之一,可用于存储多个值。列表操作是Scheme的一个强大特性,可以通过多种方式创建、修改和遍历列表。 - **条件语句(if...