看了javaeye上一个解决约瑟夫环的问题的帖子,就想能不能用scheme来解决。如果采用推导出的数学公式来处理当然很简单了:
(define (joseph n m)
(define (joseph-iter init s)
(if (> init n)
(+ s 1)
(joseph-iter (+ init 1) (remainder (+ s m) init))))
(joseph-iter 2 0))
我想是否可以用一般的模拟算法来实现?也就是模拟一个循环链表,每次删除第m个元素。弄了个比较丑陋的实现:
(define (enumrate-interval low high)
(if (> low high)
'()
(cons low (enumrate-interval (+ low 1) high))))
(define (delete-last list)
(if (eq? (cdr list) '())
'()
(cons (car list) (delete-last (cdr list)))))
(define (joseph-iter init list it)
(let ((m (remainder it (length list))))
(cond ((= m 0) (delete-last list))
((= m 1) (append (cdr list) (reverse init)))
(else
(joseph-iter (cons (car list) init) (cdr list) (- m 1))))))
(define (joseph n m)
(define (joseph-list list m)
(display list)
(newline)
(if (eq? (cdr list) '())
(car list)
(joseph-list (joseph-iter '() list m) m)))
计算(joseph 8 3)的过程如下:
(1 2 3 4 5 6 7 8)
(4 5 6 7 8 1 2)
(7 8 1 2 4 5)
(2 4 5 7 8)
(7 8 2 4)
(4 7 8)
(4 7)
(7)
7
看了这个计算过程就知道我这个方法多糟糕,每次都重新构造列表。不知道牛人们有没有更好的思路来实现模拟算法?
分享到:
相关推荐
对比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编程是两种强大的工具,用于扩展其内置功能,解决复杂的流体动力学问题。本主题主要关注如何利用这两种技术进行混合编程,以模拟蓄热式熔铝炉的工作过程,包括...
以二维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 ...
在Scheme中,函数可以调用自身,这种能力使得解决复杂问题变得简洁且易于理解。学习Scheme时,你需要理解如何设计和使用递归函数,以及如何处理递归的终止条件。 其次,Scheme采用了一种叫做“读-求值-打印循环”...
在Android应用开发中,"Scheme跳转"是一种重要的交互方式,允许不同的应用程序之间进行通信和数据交换。"Scheme"在Android系统中扮演着URL协议的角色,类似于网页浏览器中的http或https,但它是专为Android应用设计...
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标准并不直接支持模式匹配,但许多实现提供了...
书中还探讨了Scheme语言的深层次应用,例如语法扩展(Syntactic Extension)的概念,这允许程序员定义新的语法形式,以更接近问题领域的方式编写程序。还有对象操作中的各个特定数据类型的详细介绍和处理方法,这些...
合理管理变量有助于避免命名冲突等问题。 - **列表(Lists)**:列表是Scheme中非常重要的数据结构之一,可用于存储多个值。列表操作是Scheme的一个强大特性,可以通过多种方式创建、修改和遍历列表。 - **条件语句(if...