`
ruruhuang
  • 浏览: 193328 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

《Java软件结构:设计和使用数据结构(第2版)》读书笔记1-递归

阅读更多

Java软件结构:设计和使用数据结构(第2版)》读书笔记1-递归

  大学的数据结构和算法根本就是混过来的,某天在某某论坛里有个关于数据结构和算法到底在日常的编程到底有多大的用处。对于我来说,我并不觉得我用上了那些讲的数据结构和算法。Java Collection Framework已经跟我们做了这些。我已经能非常熟练的使用Collection里面的类库。但是我们用的基本上都是那些线性集合(堆栈,队列,列表,Set),非线性集合(树,堆,散列和图)我感觉比较少用到。我也主要是想对非线性集合做一些比较。线性集合比较简单。

 

  第一章到第九章都是讲线性集合, 也比较容易理解, 在这里就忽略掉。第十章是讲递归算法。我对这章比较感兴趣,用递归实现某个算法真的感觉非常优雅,代码短而少,许多非线性集合都是用递归来实现的。但也有他的缺点, 对方法的每次递归调用都会生成新的局部变量和局部参数。假如递归层次太多的话,就会消耗太多的stack

 

任何递归定义都必须有一个非递归部分;这个非递归部分叫做基本情况,它使的递归跳出无穷循环递归。

Ex 1 1~N的累加过程,数值1N的累加可以看成是1N<spanstyle="font-family:宋体">-1的累加加上N

 

       public int sum(int num){

              
int result = 0;

              
if (num == 1){

                     
return 1;

              }


              
return result + num + sum(num - 1);

       }

这里的基本情况就是但num==1的时候。 当然这个可以不用递归来处理,用一个for就行了(而且比用递归更直观)。我们必须能判断什么时候使用递归,什么时候不使用递归,所有问题都可以使用迭代(for循环)解决问题。不过有些情况下,迭代方式过于复杂,对某些问题,递归可以写出短小而优雅的代码。

 

直接递归和间接递归,方法调用自己,这就是直接递归(如上个例子)。方法调用另一个方法,最终导致再调用原方法。这就是间接递归。

 

河内塔问题(Towers of Hanoi)(可以上网找找这个经典问题的描述)

规则:

l         一次只能移动一张圆盘

l         不能将大盘放在小盘的上方

l         除了那张在柱子之间搬动的圆盘之外,所有圆盘都必须在某根柱子上

 

策略:

l         将最上方的N1张圆盘从最初的柱子移到那根多处的柱子上

l         将最大的圆盘从最初的柱子移动到最终的柱子上

l         再将那个多出柱子上的N1张圆盘移到最终的柱子上

 

Code

public      class TowersOfHanoi{

              
private int totalDisks;

              
// ------------------------------------------------------

              
// Sets up the puzzle with the specified number of disks

              
// ------------------------------------------------------

              
public TowersOfHanoi(int disks){

                     
this.totalDisks = disks;

              }


              
// ----------------------------------------------------------

              
// Performs the initial call to moveTower to solve the puzzle.

              
// Moves the disks from tower 1 to tower 3 using tower 2

              
// ----------------------------------------------------------

              
public void solve(){

                     moveTower(totalDisks, 
13,2);

              }


              
// -----------------------------------------------------------------

              
// Moves the specified number of disks from one tower to another by 

              
// moving a subtower of n-1 disks out of the way, moving one disk, 

              
// then moving the subtower back, Base case of 1 disk.

              
// -----------------------------------------------------------------

              
private void moveTower(int numDisks, int start, int end, int temp) {

                     
if (numDisks == 1){

                            moveOneDisk(start, end);

                     }
else{

                            moveTower(numDisks
-1, start, temp, end);

                            moveOneDisk(start, end);

                            moveTower(numDisks
-1, temp, end, start);

                     }


              }


              
private void moveOneDisk(int start, int end) {

                     System.out.println(
"Move one disk from " + start + " to " + end);

              }


       }

分享到:
评论

相关推荐

    《数据结构和问题求解(Java语言版)(第四版)》源码

    《数据结构和问题求解(Java语言版)(第四版)》是一本经典的计算机科学教材,主要探讨了如何使用Java语言来实现和理解各种数据结构以及算法。这本书的源码提供了丰富的实例,帮助读者深入理解数据结构和算法的实际应用...

    JAVA数据结构笔记

    在Java编程中,数据结构是理解复杂算法和高效程序设计的基础。本笔记主要涵盖了从第一章到第六章关于数据结构和...这些章节覆盖了Java数据结构的基础,包括基本概念、操作和算法,为深入学习和应用提供了坚实的基础。

    数据结构笔记和课后答案

    - 阅读经典书籍和文献,如严蔚敏版《数据结构》等。 - 参与在线课程和讨论,提高自己的理论水平和实战能力。 #### 二、时间复杂度与空间复杂度 **2、时间复杂度与空间复杂度:** - **时间复杂度**表示算法执行...

    李兴华java笔记

    ### Java核心知识精讲 #### 一、Java简介 Java是一种广泛使用的高级编程语言...以上就是从“李兴华java笔记”中提取的核心知识点,涵盖了Java的基础语法、面向对象编程的基本概念和技术点。希望对学习Java有所帮助。

    Java Data Structrue

    本篇内容基于《Java数据结构与算法》第二版的学习笔记,深入探讨了数据结构和算法的基本概念及其在Java编程语言中的应用。 #### 二、数据结构概述 数据结构是指在计算机中组织和存储数据的方式。不同数据结构的...

    《数据结构——C++实现》(第二版)课本源代码.zip

    通过《数据结构——C++实现》(第二版)的学习,读者不仅能掌握各种数据结构的原理,还能熟悉C++编程,为后续的软件开发和算法设计打下坚实基础。同时,书中提供的源代码是宝贵的实践资源,可以帮助读者在实践中学习...

    勤思l01-8笔记知识点.rar

    2. **数据结构**:介绍数组、链表、栈、队列、树、图等基本数据结构,以及它们的操作和用途。 3. **算法**:包括排序(冒泡、选择、插入、快速等)、搜索(线性、二分等)、递归和动态规划等基本算法。 4. **...

    《labuladong算法小抄》2021完整版 共666页

    《labuladong算法小抄》压缩整理-第零章:框架结构之数据结构 一、存储方式 1、根本存储方式:数组(顺序存储)、链表(链式存储) 2、【队列】、【栈】 3、【图】 4、【散列表】:用散列函数把键映射到一个大数组 5...

    快学Scala 第2版.zip

    通过阅读《快学Scala 第2版》,读者不仅能掌握Scala的基础知识,还能了解到如何在实际的大数据场景中运用这些知识,从而提升开发效率和解决问题的能力。对于希望进入大数据领域的开发者,这本书无疑是一份宝贵的资源...

    传智播客视频JavaSE学习笔记

    集合框架是Java为存储和操作一组对象而设计的一组类和接口的集合,提供了灵活的数据结构支持。 #### 二、Collection接口 `Collection`是集合框架的核心接口,所有集合类都直接或间接实现了该接口。 #### 三、List...

    javalruleetcode-Leetcode:算法和数据结构解决方案

    数据结构和算法 Lintcode 解决方案 阶梯 - 算法 1 - 击败算法面试 不。 标题 解决方案 困难 标签 笔记 627 最长回文 简单的 哈希表 13 实现 strStr 简单的 细绳 415 有效回文 中等的 特点 200 最长回文子串 中等的 ...

    LeetCode前400题Java精美版

    【LeetCode前400题Java精美版】是个人对LeetCode中前400道题目进行解答并整理的笔记,主要使用Java语言编写。这个资料的特点在于,它提供的解决方案多数情况下是经过优化的,能够击败99%的提交,即使在某些复杂问题...

    java简易版开心农场源码-training.computerscience.algorithms-datastructures:培训.计算机

    java简易版开心农场开源算法和数据结构 我在 UC San Diego MicroMasters Program 中的笔记,以及我同时做的所有阅读材料(见下文) 我的 anki 抽认卡: : 34 张卡片 目录 先决条件 归纳证明 它允许通过以下方式证明...

    算法和数据结构

    1. **源代码文件**:用各种编程语言(如C++, Java, Python等)实现的算法和数据结构示例。这有助于理解如何在实际中应用理论知识。 2. **测试文件**:用于验证算法正确性的测试用例,这些测试用例通常覆盖了各种...

    Pemograman-lanjut-semester-2:源代码2 Andhika prasetyo

    1. 数据结构与算法:包括数组、链表、栈、队列、树、图等基本数据结构,以及排序(如冒泡、选择、插入、快速、归并等)、查找(如线性、二分、哈希等)和递归等算法。 2. 面向对象编程:深入理解类、对象、继承、...

    家庭作业周1

    在IT领域,学习通常涵盖多个主题,如编程语言(如Python、Java、C++)、数据库管理(SQL)、网络技术、操作系统原理、数据结构与算法、软件工程、人工智能、机器学习等。因此,这份"家庭作业周1"可能涉及到这些领域...

    firstAlgorithmCourse:我的第一门Coursera算法课程

    在学习算法时,Java提供了清晰的语法和强大的数据结构支持,非常适合初学者入门。 在【压缩包子文件的文件名称列表】"firstAlgorithmCourse-master"中,我们可以推断出这可能是一个GitHub仓库的名字,通常包含一个...

    2015-02-Algoritimos-3

    此外,可能还会包含一些实际应用示例,比如如何使用这些算法解决实际编程挑战,以及如何在Java中有效利用内置数据结构和类库来实现这些算法。对于初学者,这样的资源将提供宝贵的实践机会,加深对算法和Java编程的...

    2021algorithm:我的第一仓库

    2. **数据结构**:包括数组、链表、栈、队列、哈希表、树(二叉树、平衡树如AVL和红黑树)、图等。每个数据结构都有其特定的用途和操作,理解它们对于解决实际问题至关重要。 3. **算法分析**:涉及到时间复杂性和...

Global site tag (gtag.js) - Google Analytics