河内塔问题解决方案2(Common Lisp实现)
河内塔问题的初始状态有A、B、C三根柱子,在A柱上有中间带孔从大到小由下到上重叠像“塔”一样的n个圆盘。目标状态是将“塔”移到B柱上,C柱作为过渡。规则是每次只能移动最上面的一个圆盘, 大圆盘不能压在小圆盘上。
这个问题可通过下述三个步骤解决:
(1)将A柱上顶层的n-1个圆盘移到C柱;
(2)将A柱底部最大的圆盘移到B柱;
(3)将n-1个圆盘从C柱移到B柱。
借助于递归,直到n的值为1时,才做实际的移动工作。
假设n个圆盘按照从小到大的顺序编号,即n个圆盘的编号为从1至n。柱子上的圆盘用数字表表示;比如,若A为表(1 2 3),则表示A柱上的圆盘从上到下是编号依次为1、2、3的圆盘。
三个柱子初始时的状态为:A,(1 2 3); B,(); C, ()。
实现程序代码如下(可打印出有关步骤的详细信息)。
函数的定义
;从from柱移动一个圆盘到to柱
(defun move_disk (from to)(print (list 'move (car (eval from)) ;打印出移动圆盘的编号'from from ;移出柱'to to ;移入柱) )(cond;移出柱为空((null (eval from)) (print (list from 'empty)) ;打印移出柱为空);移入柱为空或其顶端圆盘大于移出柱的顶端圆盘((or (null (eval to)) (> (car (eval to)) (car (eval from))) ) (set to (cons (car (eval from)) (eval to) ) ) ;将圆盘添加到移入柱(set from (cdr (eval from))) ;将圆盘从移出柱去除);非法移动(T(print (list 'cannot 'move (car (eval from))'onto(car (eval to)))))) ;cond结束(list (list'move (car (eval to)) ;圆盘的编号'from from ;从哪个柱子'to to ;到哪个柱子))
);借助spare柱, 将n个圆盘从from柱移动到to柱
(defun transfer ( from to spare n)(cond((equal n 1) (move_disk from to)) ;移动一个圆盘(T (append (transfer from spare to (- n 1)) ;借助to柱, 将n-1个圆盘从from移到to(move_disk from to) ; 移动最下面的圆盘(transfer spare to from (- n 1)) ; 借助from柱, 将n-1个圆盘从spare移到to)))
);河内塔问题
(defun tower_of_hanoi ()(transfer 'A 'B 'C (length A))
)
程序的运行:
程序的运行命令如下
(setq A '(1 2 3) B NIL C NIL) ;柱子初始状态(tower_of_hanoi)
程序运行结果如下:
河内塔问题解决方案2(Common Lisp实现)相关推荐
- 河内塔问题解决方案1(Common Lisp实现)
河内塔问题的初始状态有A.B.C三根柱子,在A柱上有中间带孔从大到小由下到上重叠像"塔"一样的n个圆盘.目标状态是将"塔"移到B柱上,C柱作为过渡.规则是每次只 ...
- 实用Common Lisp编程——函数
有了语法和语义规则以后,所有Lisp程序的三个最基本组成部分就是函数.变量和宏.在第3章里构建数据库时,这三个组件已经全部用到了,但是我没有详细提及它们是如何工作的,如何更好使用它们.接下来的几章将专 ...
- 河内塔递归_使用递归的河内塔问题的C程序
河内塔递归 Here you will get C program for tower of hanoi problem using recursion. 在这里,您将获得使用递归的河内塔问题的C程序 ...
- Practical Common Lisp
Practical Common Lisp Practical Common Lisp
- Vim 下使用 Slimv(类似Slime) 轻松调试 Common Lisp
2019独角兽企业重金招聘Python工程师标准>>> Vim 下使用 Slimv(类似Slime) 轻松调试 Common Lisp 目录 前情回顾 安装slimv 数据配置 默认 ...
- Common Lisp语言快速入门
zhezhelin Common Lisp语言快速入门 Lisp是软件领域的分裂力量.一方面,Lisp爱好者誓言Lisp比软件领域内的其它语言都更加快捷.整洁和强大:而反对者则辩称,不可靠的执行和库支 ...
- Common Lisp 初学者快速入门指导
看了<黑客与画家>,对Lisp语言比较好奇,于是就弄了本<Lisp使用教程>,有空的时候就学习一下.Lisp的实现有很多,我用的Emacs+sbcl+slime,因为网上资料比 ...
- Common Lisp 操作Mysql
2019独角兽企业重金招聘Python工程师标准>>> Common Lisp 通过CFFI可以调用其它语言的接口,如此,Common Lisp可以快速开发各种应用程序,本文将讲述在 ...
- Common Lisp 函数 require 和 provide 源代码分析
2019独角兽企业重金招聘Python工程师标准>>> Common Lisp 函数 require 和 provide 源代码分析 === 涉及文件: l1-files.lisp ...
最新文章
- 文巾解题 1. 两数之和
- 浅谈unity中gamma空间和线性空间
- 中科燕园GIS外包案例之五---地下管线GIS管理信息系统
- android md 控件,Android基本UI控件.md
- pin controller driver代码分析
- wps临时文件不自动删除_电脑:让 Windows 10 系统自动清理临时文件
- SQL Server使用convert对datetime日期数据进行获取
- 编程面试问题越难越好?!
- ReflectionZ_测试_01
- 中科易安:公安对接流动人口管理智能锁需要联网吗?
- 计算机兼容性测试怎么做,如何进行兼容性测试
- TCP SYNCookie机制
- VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序)
- Allegro如何使用快捷键快速切换走线线宽操作指导
- 开箱即用的Vue 框架
- 微信小程序点击--实现带字母索引的城市列表
- 学校计算机有麦克风吗,一体机有麦克风功能吗
- 个人开发者一分钟接入微信支付宝支付
- VS2015中无法查找或打开 PDB 文件
- ZZULIOJ 2411: 摘柿子
热门文章
- Jsonpath语法
- 基于javaweb+jsp的校园兼职管理系统(java+SSM+Jsp+Mysql)
- Netty教程02:Netty实战之TCP服务
- 小米桌面就是 Launcher3去掉主菜单
- html打印当前页面的函数,js调用iframe实现打印页面内容的方法
- matlab cell2mat 一维,MATLAB cell2mat(...)與具有一束稀疏矩陣的單元陣列功能,內存溢出意外...
- 650c公路车推荐_沉睡十年,再获新生——记家中领导trek 650c公路车落地
- Ec/Io____C/I
- 利用python实现猜数字小游戏
- 下面的文字是用来纪念我逝去的爱情