scheme递归】的更多相关文章

主要参考: http://www.shido.info/lisp/scheme7_e.html Function fact that calculates factorials. (define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))) (fact 5) is calculated like as follows: (fact 5) ⇒ 5 * (fact 4) ⇒ 5 * 4 * (fact 3) ⇒ 5 * 4 * 3 * (fact 2)…
A procedure body can contain calls to other procedures, not least itself: (define factorial (lambda (n) (if (= n 0) 1 (* n (factorial (- n 1)))))) This recursive procedure calculates the factorial of a number. If the number is 0, the answer is 1. For…
      最终我失败了,这是显而意见,我试图在一个很看重类型是什么的语言中实现无类型操作,事实上,哪怕我实现了基本的cons,car,cdr,list后面的代码也无法写下去.比如说list-n,根据n的不同返回不同的类型,这个函数只能用一些奇淫怪巧来实现,和boost的代码库源代码一样的难度,我实现is_pair这种函数的时候,压根就没用到他那个函数,实现list时候,是一个大神妹子给我了解决方案,但是后续的代码有些能写,比如求list的长度,但是反正list第n项真心无法写,不是无法写,而是…
发表在<程序猿>2007年7月刊上.不log上写帖子不用考虑版面限制,所以这里的帖子比发表的啰嗦点.赵健平编辑,Jacky,和刘未鹏都给了我非常多帮助,在这里一并谢了.免费的Scheme实现非常多.我用的是PLT Scheme,能够到这里下载.PLT Scheme的IDE(Dr. Scheme)支持Emacs的键盘绑定,用emacs的老大们应该喜欢.Dr.Scheme内置中文支持: 以下是正文: 不能影响你思考方式的编程语言不值得学习 – Alan Perlis[1]   不少朋友问,为什么要…
是任意形式的递归,是化解的一般式. 主题所谓的“递归调用化解为栈处理”,意思是,将递归函数调用化解为“一个由stack_push stack_pop stack_top等函数调用组成的循环式子”.这里的 stack_push, stack_pop, stack_top是指,程序员自己实现的一个ADT(Abstract Data Type)中的函数操作接口,这个ADT叫做栈.要知道,在C语言中,函数调用链本身就是栈处理的,处理C语言中函数调用链的是进程栈/线程栈,进程栈/线程栈是一个C语言程序运行…
在win7下可安装MIT-GUN scheme, 点开后有两个界面:一个交互式命令行界面:一个Edwin界面.    在命令行界面按Ctrl-G可以开始输入.在Edwin界面,输入完整命令后按Ctrl-x Ctrl-e可以求值. 启动mit-scheme时报“Requested allocation is too large, try again with a smaller arguement to '--heap'”,需要尝试好几次才能打开.查询用户手册得到以下信息: (一)Scheme使用…
Continuation Pass Style在函数式编程(FP)中有一种被称为Continuation Passing Style(CPS)的风格.在这种风格的背后所蕴含的思想就是将处理中可变的一部分抽象为一个function,并将其作为一个参数传入.这是高度抽象的方法,所带来的表达的威力也是无与伦比的.下面举一个例子,实现CPS描述的fold函数.在此之前需要简单介绍一下fold概念,在FP中这是一个非常有效的处理list的工具.一般它的signature是fold(f,initial,li…
程序中为什么需要栈stack? 普通的程序中,接触到子程序和函数的概念,很直观地,调用子程序时,会首先停止当前做的事情,转而执行被调用的子程序,等子程序执行完成后,再捡起之前挂起的程序,这有可能会使用刚才子程序计算出的数据.但是在程序被挂起的地方重新捡起程序并继续执行需要一个机制,即,存储当前所做事情的相关信息和以后在哪里捡起这个程序(现场信息).这时,栈自然而然就是满足这种需要的一个数据结构(为什么使用栈略过不提). 如果情况发生改变,没有函数需要返回,函数要么终止程序,要么是调用另一个函数,…
表转化成平衡二叉树 其中有一种分治的思想. (define (list->tree elements) (define (partial-tree elts n) (if (= n 0) (cons '() elts) (let ((left-size (quotient (- n 1) 2))) (let ((left-result (partial-tree elts left-size))) (let ((left-tree (car left-result)) (non-left-elt…
说明,这是r5rs的用法. (letrec ((<variable> <init>) ...) <body>) 假设((<variable> <init>) ...)是变量定义块V,<body>是执行块B. letrec最常见的用法就是用于绑定函数对象,让V里面定义的所有变量可以在运行时相互引用,不受位置前后的限制.比如: > (letrec ((x (lambda () (+ y y))) (y )) (+ (x) y)) 这…