今天一位同事给我看了几个她看到的关于编程基础的小问题。感觉很有意思!说这几个是小问题,是因为谁都会做。说它们有难度——确实是现在多数的初级程序员遇到这种初级问题,还真的难以做得有多完美。那么接下来几天,就逐一的对这几个问题进行演练。
在这里需要考察的基本素质是:变量的赋初值的编程习惯。还有就是parseFloat的数据类型转换。
当然,如果你能写出parseFloat(arrData[i], 10), 加十分。能使用toFixed(n)这个函数,再加二十分。
第三个方法是递归。递归的方法应该属于偏中级算法了。对于Web程序员来说,虽然递归算法属于基本素质,但是用到的可能性毕竟不是很大。面试的时候,20%的面试者能够正确的描述这个算法。正确写出来的可能只有其中的一半。这里要注意的是,递归算法在考虑问题的时候,未必是从头到尾的考虑问题。比如下面的例子,是从后向前考虑问题。
此处的处理,之所以是从后向前处理是出于一种习惯。从后往前写,程序中后一个特例处理只有0了。而0是指数组中并不存在的第0个值。我们只需要赋给它一个对运算结果无影响的数就可以了。如果从前向后进行计算的话,不是不可以。但是也有一个最后一位处理的问题,这时候就易读性和可操作性都会变差。
最后是上边4个求和计算方法的实际验证页面。 点击这里
问题1. 使用for循环、while循环和递归写出3个函数来计算给定数列的总和。
首先是for循环,这是最基本的计算。
var arrData = [1,2,3];
var summary = 0;
for( i = 0; i < arrData.length; i++){
summary += parseFloat(arrData[i]);
}
alert(summary);
在这里需要考察的基本素质是:变量的赋初值的编程习惯。还有就是parseFloat的数据类型转换。
当然,如果你能写出parseFloat(arrData[i], 10), 加十分。能使用toFixed(n)这个函数,再加二十分。
第二是while循环,这个循环语句在程序中没有for循环常用。但是在处理一些非定长循环逻辑等方面,能够比for更加灵活。当然,while中的条件部分有可能被写成永真式,造成程序死循环。这是程序员首先必须首先规避的问题。实例代码如下。
var arrData = [1,2,3];
var summary = 0;
i = 0;
while(i < arrData.length ){
summary += parseFloat(arrData[i]);
i++;
}
alert(summary);
第三个方法是递归。递归的方法应该属于偏中级算法了。对于Web程序员来说,虽然递归算法属于基本素质,但是用到的可能性毕竟不是很大。面试的时候,20%的面试者能够正确的描述这个算法。正确写出来的可能只有其中的一半。这里要注意的是,递归算法在考虑问题的时候,未必是从头到尾的考虑问题。比如下面的例子,是从后向前考虑问题。
var arrData = [1,2,3];
/**
* 用递归算法求数组的和
* @param arr 被求和的数组
* @param n 数组的第n个值, 注意其上标为n-1
*/
function sum(arr, n) {
if (n > 0) {
return parseFloat(arr[n - 1]) + sum(arr, n - 1);
} else {
return 0;
}
}
alert(sum(arrData, arrData.length));
此处的处理,之所以是从后向前处理是出于一种习惯。从后往前写,程序中后一个特例处理只有0了。而0是指数组中并不存在的第0个值。我们只需要赋给它一个对运算结果无影响的数就可以了。如果从前向后进行计算的话,不是不可以。但是也有一个最后一位处理的问题,这时候就易读性和可操作性都会变差。
补充第四个方法,是直接用eval进行字符串拼接的运算。这在一维数组计算中是一个非常常用的偷懒方法。
var arrData = [1,2,3];
alert(eval(arrData.join("+")));
最后是上边4个求和计算方法的实际验证页面。 点击这里