您的位置:首页 > 理论基础

像计算机一样思考

2013-10-01 14:32 162 查看
老师说要学会计算机一样的思考方式,这样你才能写出计算机和人都能读懂的代码。

其实我现在首先要学会的,是计算机一样的思考方式。

我发现老师最有趣的地方,就是对着一段代码能够用大白话的方式把它读出来。怎么说呢,举个栗子。比如写了一个for循环。

他会这样读到(前略) 新建一个变量a初始化为0,条件a小于7,满足。执行循环体,(中略)循环体结束。变量a自增1,小于7,满足。再次执行循环体……

大致如此,总之那些刻板的字符组合随着他这么一读,似乎我们自己就变成了计算机,然后思想就开始依次执行屏幕上的每条语句。

这真的是一件很有趣的事情。

所以今天我尝试了一下,因为我写了两段自己都读不懂的代码。

public static int getMax(int[] arr)
{
int max=arr[0];

for (int x=arr[0]; x<arr.length; x++)
{
if (x<arr[0])
max= x;
}
return arr[max];
}

public static void main (String[] arg)
{

int[] arr={3,1,4,8,5,9,7,6};

int max =getMax(arr);

System.out.println("max="+max);

}


最初需求是获取一个数组中的最大值。

写完之初,尝试着自己在大脑里运行一遍代码,隐约感觉到结果并不正确,但又说不上来哪里不对。

然后编译通过,运行结果是——

max=8

这显然是一个错误的答案。

然后我开始逐步用自己的语言读代码。

pubilc static int getMax(int []arr)

定义一个名为getMax的函数,返回值为int类型。函数里定义一个整数数组型数据,名为arr。

int max= arr[0];

新建一个变量max,初始化值为arr数组中0角标元素(数组中这个角标对应了一个整数)。

for (int x=arr[0]; x<arr.length; x++)

创建一个循环,新建临时变量x,初始化值为arr数组中0角标元素,循环条件为:初始化值小于数组长度(在下面的步骤里能知道数组长度为8),循环体运行一次之后变量自增1.

if (x<arr[0])

max = x

循环中使用判断,如果变量x的值小于arr数组中0角标上的值,就用max记录住这个较小的值。然后循环体在这里结束。从这里可以看出取出的应该是最小值,已经有问题了。

return arr[max];

返回,返回数组arr未知角标上的值,这个角标序号由上面语句max取出的值决定。

因为下面的代码里已经定义了数组中具体的元素,所以可以单独运行一次这个函数,看看返回值为多少。

int[] arr={3,1,4,8,5,9,7,6};

第一次循环时:

max=3

x=3

满足循环条件进行循环,判断条件不符合,不执行赋值操作,然后x变量自增;

第二次循环时:

max=3

x=4

满足循环条件,判断条件不符,x自增1;

因为x一直自增下去永远不会小arr数组0角标元素3,所以判断语句不会被执行。

直到x自增到8,不满足循环条件,循环停止。

这时,max值依然为3

最后return 语句返回值,返回的值就是arr[3],即arr数组中3角标元素,这个元素为8

接着到主函数里面,语句先省略。

int[] arr={3,1,4,8,5,9,7,6};

定义一个数组名为arr,指定内部存放的元素。

int max= getMax(arr);

定义一个变量max,这个和上个函数中的max不是同一个。把函数getMax返回的值赋给它。由上面的步骤能够知道,这个返回值为8

所以,参考打印语句最终打印的结果便为:

max=8

************************************************************************

所以这段代码最终即没有取到数组中最大的值,也没有取出最小的值。

现在出现问题的地方很明显了,定义判断条件出错,导致用于记录比较结果的变量并没有起到应有的作用。

PS:

老师的那句话真的给了我很大的动力——所谓的经验就是你见过的错误。当每个错误都能解决之后,避免重复出现同样的错误,以及再一次遇到时能迅速解决。这些加起来就会变成自己的能力。

当然还有很重要的一点,就是思考的方式。

开始慢慢的意识到自己要走的路还很长很长……不管怎样,努力吧:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: