像计算机一样思考


老师说要学会计算机一样的思考方式,这样你才能写出计算机和人都能读懂的代码。


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


我发现老师最有趣的地方,就是对着一段代码能够用大白话的方式把它读出来。怎么说呢,举个栗子。比如写了一个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:


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


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


开始慢慢的意识到自己要走的路还很长很长……不管怎样,努力吧:)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值