河内塔问题的初始状态有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. 河内塔问题解决方案1(Common Lisp实现)

    河内塔问题的初始状态有A.B.C三根柱子,在A柱上有中间带孔从大到小由下到上重叠像"塔"一样的n个圆盘.目标状态是将"塔"移到B柱上,C柱作为过渡.规则是每次只 ...

  2. 实用Common Lisp编程——函数

    有了语法和语义规则以后,所有Lisp程序的三个最基本组成部分就是函数.变量和宏.在第3章里构建数据库时,这三个组件已经全部用到了,但是我没有详细提及它们是如何工作的,如何更好使用它们.接下来的几章将专 ...

  3. 河内塔递归_使用递归的河内塔问题的C程序

    河内塔递归 Here you will get C program for tower of hanoi problem using recursion. 在这里,您将获得使用递归的河内塔问题的C程序 ...

  4. Practical Common Lisp

    Practical Common Lisp Practical Common Lisp

  5. Vim 下使用 Slimv(类似Slime) 轻松调试 Common Lisp

    2019独角兽企业重金招聘Python工程师标准>>> Vim 下使用 Slimv(类似Slime) 轻松调试 Common Lisp 目录 前情回顾 安装slimv 数据配置 默认 ...

  6. Common Lisp语言快速入门

    zhezhelin Common Lisp语言快速入门 Lisp是软件领域的分裂力量.一方面,Lisp爱好者誓言Lisp比软件领域内的其它语言都更加快捷.整洁和强大:而反对者则辩称,不可靠的执行和库支 ...

  7. Common Lisp 初学者快速入门指导

    看了<黑客与画家>,对Lisp语言比较好奇,于是就弄了本<Lisp使用教程>,有空的时候就学习一下.Lisp的实现有很多,我用的Emacs+sbcl+slime,因为网上资料比 ...

  8. Common Lisp 操作Mysql

    2019独角兽企业重金招聘Python工程师标准>>> Common Lisp 通过CFFI可以调用其它语言的接口,如此,Common Lisp可以快速开发各种应用程序,本文将讲述在 ...

  9. Common Lisp 函数 require 和 provide 源代码分析

    2019独角兽企业重金招聘Python工程师标准>>> Common Lisp 函数 require 和 provide 源代码分析 === 涉及文件: l1-files.lisp ...

最新文章

  1. 文巾解题 1. 两数之和
  2. 浅谈unity中gamma空间和线性空间
  3. 中科燕园GIS外包案例之五---地下管线GIS管理信息系统
  4. android md 控件,Android基本UI控件.md
  5. pin controller driver代码分析
  6. wps临时文件不自动删除_电脑:让 Windows 10 系统自动清理临时文件
  7. SQL Server使用convert对datetime日期数据进行获取
  8. 编程面试问题越难越好?!
  9. ReflectionZ_测试_01
  10. 中科易安:公安对接流动人口管理智能锁需要联网吗?
  11. 计算机兼容性测试怎么做,如何进行兼容性测试
  12. TCP SYNCookie机制
  13. VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序)
  14. Allegro如何使用快捷键快速切换走线线宽操作指导
  15. 开箱即用的Vue 框架
  16. 微信小程序点击--实现带字母索引的城市列表
  17. 学校计算机有麦克风吗,一体机有麦克风功能吗
  18. 个人开发者一分钟接入微信支付宝支付
  19. VS2015中无法查找或打开 PDB 文件
  20. ZZULIOJ 2411: 摘柿子

热门文章

  1. Jsonpath语法
  2. 基于javaweb+jsp的校园兼职管理系统(java+SSM+Jsp+Mysql)
  3. Netty教程02:Netty实战之TCP服务
  4. 小米桌面就是 Launcher3去掉主菜单
  5. html打印当前页面的函数,js调用iframe实现打印页面内容的方法
  6. matlab cell2mat 一维,MATLAB cell2mat(...)與具有一束稀疏矩陣的單元陣列功能,內存溢出意外...
  7. 650c公路车推荐_沉睡十年,再获新生——记家中领导trek 650c公路车落地
  8. Ec/Io____C/I
  9. 利用python实现猜数字小游戏
  10. 下面的文字是用来纪念我逝去的爱情