像计算机一样思考
2013-10-01 14:32
162 查看
老师说要学会计算机一样的思考方式,这样你才能写出计算机和人都能读懂的代码。
其实我现在首先要学会的,是计算机一样的思考方式。
我发现老师最有趣的地方,就是对着一段代码能够用大白话的方式把它读出来。怎么说呢,举个栗子。比如写了一个for循环。
他会这样读到(前略) 新建一个变量a初始化为0,条件a小于7,满足。执行循环体,(中略)循环体结束。变量a自增1,小于7,满足。再次执行循环体……
大致如此,总之那些刻板的字符组合随着他这么一读,似乎我们自己就变成了计算机,然后思想就开始依次执行屏幕上的每条语句。
这真的是一件很有趣的事情。
所以今天我尝试了一下,因为我写了两段自己都读不懂的代码。
最初需求是获取一个数组中的最大值。
写完之初,尝试着自己在大脑里运行一遍代码,隐约感觉到结果并不正确,但又说不上来哪里不对。
然后编译通过,运行结果是——
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:
老师的那句话真的给了我很大的动力——所谓的经验就是你见过的错误。当每个错误都能解决之后,避免重复出现同样的错误,以及再一次遇到时能迅速解决。这些加起来就会变成自己的能力。
当然还有很重要的一点,就是思考的方式。
开始慢慢的意识到自己要走的路还很长很长……不管怎样,努力吧:)
其实我现在首先要学会的,是计算机一样的思考方式。
我发现老师最有趣的地方,就是对着一段代码能够用大白话的方式把它读出来。怎么说呢,举个栗子。比如写了一个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:
老师的那句话真的给了我很大的动力——所谓的经验就是你见过的错误。当每个错误都能解决之后,避免重复出现同样的错误,以及再一次遇到时能迅速解决。这些加起来就会变成自己的能力。
当然还有很重要的一点,就是思考的方式。
开始慢慢的意识到自己要走的路还很长很长……不管怎样,努力吧:)
相关文章推荐
- 怎样像一名计算机科学家一样思考pdf
- <像计算机科学家一样思考>笔记
- 计算机一样思考的大脑是如何练成的
- 1.1 什么是编程语言:如何像计算机专家一样思考(C++版
- 像计算机科学家一样思考python2 笔记 - 类和对象
- 学会像计算机程序一样思考
- 如何象计算机专家一样思考:学习Python 前言
- 如何像计算机科学家一样思考(书摘)
- 如何象计算机专家一样思考:学习Python --序
- 如何像计算机科学家一样思考
- 如何象计算机专家一样思考:学习Python--第一章
- 如何像黑客一样思考_转
- 《像外行一样思考,像专家一样实践》
- 像优秀的SQL程序员一样思考
- 苦果:像专家一样思考,像外行一样实践
- 像大师们一样思考——从“UML何时死掉”谈起
- 像程序员一样思考
- 关于计算机网络维护工作的若干思考
- 像黑客一样思考——惠普安全之道
- 像数据科学家一样思考