能看懂C++教材却写不出代码?你需要学习这种思维方式(二)
向往发起了2019-12-12
0
回复
18
浏览

知识和思考的关系

大脑不擅长处理复杂的问题,大部分普通人的思考能力差别不会很大,那为什么有的人可以解决非常复杂的问题而有的人思考简单的问题也费劲?

思考必须建立在信息和知识的基础上,我们无法凭空思考。牛顿看见苹果掉下来想到万有引力,但他 不是仅仅靠一个苹果就能推导出万有引力,而是已经具备了所有相关的物理知识。

一个人掌握的知识深度决定了他思考的深度。知识是有深浅之分的,我们深刻理解了整数加减,才能由此推导出乘除。深刻理解并熟练运用了整数乘除,才有可能去学习分数的计算。如果把加减法比作知识深度一,乘除比作知识深度二,分数计算比作知识深度三。当我们掌握深度一的知识时,可以进行深度二的思考,但无法进行深度三的思考。我们无法通过整数加减直接思考分数计算的问题。 

 

因此一个人的思考能力很大程度上取决于他的掌握的知识深度。他可以用深度一的知识作为素材直接思考深度二的问题,但无法跨级思考。直到他深刻理解了深度二的知识,才能把它们作为思考的素材,然后处理深度三的问题。

如何思考深一层的问题

很多同学没有掌握思考的方法,别说思考下一级的问题,思考同级的问题都有困难。 
上一篇文章介绍的自顶向下的方法,是做程序设计经常用的一种思维方式,把复杂的问题分解成多个简单的问题。 
这次反过来,先思考简单的问题,再由简单的问题推导出复杂的情况,我们把它叫做“从具体到抽象”的思维方法,数学里面叫做“归纳法”。 
实际上这两个方法都是在解决“大脑无法思考复杂的问题”这件事。

先看一个智力测试题: 
一个宴会,有50个人,每人头上都戴着一顶帽子。帽子只有黑白两种,黑的至少有一顶。每个人都能看到其它人帽子的颜色,却看不到自己的。主持人先让大家看看别人头上戴的是什幺帽子,然后关灯,如果有人认为自己戴的是黑帽子,就拍手。第一次关灯,没有人拍手。第二次关灯也没有人拍手,直到第三次关灯才听到拍手声。问有多少人戴着黑帽子?

这个问题看似复杂,我们要从最简单的情况推导出复杂的情况:如果只有一个黑帽子,会发生什么?

  1. 如果只有一个黑帽子,由于至少有一个人带黑帽子,黑帽子 看见所有人都是白帽子,便知道自己是黑帽子,第一次关灯就会拍手。 
    现在我们往复杂的情况推导
  2. 由于第一次没人拍手,经过第一次推导大家都知道黑帽子不止一个。 我们假设有两个黑帽子, 两个黑帽子都能看到人群中只有一个黑帽子,因此自己必定另一个黑帽子。所以第二次两个黑帽子都会拍手。
  3. 这样我们发现有n个黑帽子就需要n次推导他们才能确定自己的颜色并拍手。因此第三次有人拍手说明共有3个黑帽子。

怎么用这种方法写代码

编程中遇到的很多算法问题都可以用“从具体到抽象”的方法解决, 我们用这种方法来推导输出乘法表的程序该怎么写。 


思考一下乘法表的简化形式是怎样的? 实际上就是按阶梯的形状输出一些数据: 


如果你的思维能力或者编程能力到了这一层,就可以直接写出代码。如果没到这一层,我们也可以继续简化: 
可以从一排星星开始输出:

 cout << "*" <<endl;

再想想怎么输出两排:

cout << "*" <<endl;
cout << "**" <<endl;

虽然可以这么写,但如果要输出9行还要改成乘法表就会有点难看。大家可以自己尝试一下用这样的代码写9行乘法表是什么样子。我们跳过这一步直接改成循环,先输出两行,每行一个星号:

for(int i = 0; i < 2; ++i)
{
     cout << "*" <<endl;
}

然后改成第一行一个星号,第二行两个星号,行号越多,星号越多,所以需要第二个循环输出多个星号:

for(int i = 0; i < 2; ++i)
{
    for(int j = 0; j < i + 1; ++j)
    {
         cout << "*";
    }
    cout << endl;
}

然后把数字2改成9,星号阶梯就完成了。 
最后一步,把每一个星星改成乘法运算“1*1=1”这种形式:

for(int i = 0; i < 9; ++i)
{
    for(int j = 0; j < i + 1; ++j)
    {
         cout << i  + 1<< "*" << j + 1 << "=" << (i+1)*(j+1)  << " ";
    }
    cout << endl;
}

End

发表回复
你还没有登录,请先 登录或 注册!