欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

问题求解与算法设计

程序员文章站 2024-02-29 18:45:04
...

    学习计算机,如果一定要有一个步骤的话,我的个人理解是这样的。首先我们必须了解计算机系统必须的信息,包括计算机中的记数系统,以及在计算机中是如何表示各种类型的信息(不论说的多么天花乱坠,计算机总归是处理信息的机器,所以信息是关键)。接着,学习计算机的硬件知识,即一台计算机的现实基础是什么样的?一台计算机是怎么样组成的。学习了那么多后,接下来,我们就要从计算机是什么,转移到如何使用它。而使用计算机,其实一言以盖之,就是如何通过计算机中存储的信息来处理问题。所以这就涉及到两个知识点——1、问题求解(我们如何求解一个问题)2、算法设计(我们求解问题的方法与过程应该是计算机可以理解的)。

    所以接下来我会总结一些我学习到的分析问题求解的方法,以及使用伪代码编写解决方案,最后将伪代码翻译为一种计算机能够运行的程序设计语言。最后我们的目标是拥有,或者初步具备以下能力:1、确定一个问题是否适合计算机解决;2、使用伪代码表示算法;3、了解求证与问题求解的四点思想——信息隐蔽、抽象、事物命名和测试。

一、问题求解

    问题在字典中的定义是为调查、思考和解决而提出的难题。而问题 求解就是找到令人困惑的难题的解决方案的行动(但是就目前而言,计算机对于涉及物理行为和情感的难题,计算机尚且不能给出成熟的解决方案)。此外,如果不告诉计算机要做什么,它什么也做不了。计算机是没有智能的,它不能分析问题并产生问题的解决方案(为了解决这个问题,人们开始研究人工智能)。程序员必须研究这些问题,为解决问题开发指令集(程序),然后让计算机执行这些指令。

    但是,如果计算机不能解决问题,那么我要计算机干什么呢(有些人可能会这样问到)?其实,只要为计算机编写了解决方案(算法就是这个所谓的解决方案!!!),它就能够对不同的情况和数据快速一致地反复执行这个方案,它把人们从枯燥重复的任务中解放了出来(这就是计算机的伟大之处)!!!

    言归正传,关于如何解决问题,不得不提一本大名鼎鼎的书,这本书叫做《How to Solve It: A New Aspect of Mathematical Method》,作者是波利亚。现在我们就基于这本书,总结一下求解问题得到过程。

    1、提出问题进而理解问题:拿到一个任务,在任务明确之前,你会不停地问何时、为什么、在哪里之类的问题。所以要理解问题,我们就要不停地提出关于这个问题的问题(这句话有点绕????????????)。

    2、设计方案:找到信息和解决方案之间的联系。如果找不到直接的联系,则可能需要考虑辅助问题。最终,应该得到解决方案。

    3、执行方案:执行解决方案,检查每个步骤。自己可以清楚地看到每个步骤都是正确的,可以证明它是正确的!

    4、分析得到的解决方案:回顾,并问自己:能检查结果吗?能检查参数吗?可以得到不同的结果吗?看到过这些结果吗?可以用这个结果和方法解决其他的问题吗?

   上面就是波利亚的解决方案,而接下来我描述一些在计算机软件实际开发过程中的一些前辈们的经验:首先,永远不要彻底重新做一件事。如果解决方案已经存在了,就用这种方案。如果以前曾经解决过相同或相似的问题,只需要再次使用哪种成功的解决方案即可。识别相似的情况在计算机领域是非常有用的。在计算领域中,你会看到某种问题不断地以不同形式出现。一个好的程序员看到以前解决的任务或者任务的一部分(子任务)时,会直接选用已有的解决方案。下面来介绍一种常用的方法:

    分治法:这项方法尤其适用于计算领域。把大的问题分割成能够单独解决的小问题。分治法就好比打扫房子,打扫房子是一个大的、抽象的概念,它是由打扫每个房间这些子任务构成的。

二、算法基础

    在波利亚解决问题的方法中有这样一句话,最终应该得到解决方案。在计算领域,这种解决方案别称为算法。算法(个人浅见),就是在有限时间、有限空间内解决问题的一套计算机指令。因为是指令,且在计算领域,所以必须明确地描述人类解决方案中暗含的条件暗示(即算法中的指令是明确的)。

    计算机领域中的问题求解过程包括三个步骤,即分析和说明阶段、算法开发阶段、实现阶段和维护阶段。第一阶段输出的是清楚地问题描述。算法开发阶段输出的是第一阶段定义的问题的通用解决方案。第三阶段输出的是计算机可以运行的程序,改程序实现了这个问题专用的解决方案——算法。除非运行过程中出现了错误,或者需要改变程序,否则第四阶段没有输出。在发生了错误或改变的情况下,它们将被发送回第一阶段、第二阶段或第三阶段。

    在上述的这个方法流程中,第一步都是理解问题,不可能给根本不理解的问题编写计算机解决方案。接下来就是开发解决方案——算法。表示算法的方式有很多种。这里介绍一种方法,如下所示,它是把十进制转换成其他数制的算法。

while(商不等于0)

    用新的基数除十进制数
    把余数作为答案最左边的一位数
    用商替换原来的十进制数

    这种表示算法的形式称为伪代码,它利用自然语言和格式明确显示出了解决方案中的步骤(无论采用何种形式表示算法,都必须确保它确实能解决问题)。那么伪代码即这个人类执行的算法和计算机执行的算法之间有什么异同点?在表示计算机算法时伪代码中有哪些一定要用到的结构?

 

 

    但其实在生活中,我们大部分情况下都是在使用算法而非开发算法,那么何谓算法开发呢?我们提出几个问题,考虑几种解决的方法。而在计算领域,实现阶段要把解决方案转换成计算机能够执行的形式。为实现这种转换,需要用适当的形式表示解决方案。因此,必须开发一种方法,以问题陈述开头,以形式转换后的解决方案(算法)结束。而当前使用的把问题转换为方案的方法有两种,即自顶向下设计(功能分解)和面向对象设计(OOD)【这两种方法都是基于分支策略的】。

相关标签: 计算机基础