码迷,mamicode.com
首页 > 编程语言 > 详细

编程基本功之数组求和

时间:2015-05-13 16:47:38      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:递归算法   程序员   编程   面试   

今天CisternData的刘总给我看了几个她看到的关于编程基础的小问题。感觉很有意思!说这几个是小问题,是因为谁都会做。说它们有难度——确实是现在多数的初级程序员遇到这种初级问题,还真的难以做得有多完美。那么接下来几天,就逐一的对这几个问题进行演练。

问题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个求和计算方法的实际验证页面。 点击这里


编程基本功之数组求和

标签:递归算法   程序员   编程   面试   

原文地址:http://blog.csdn.net/u013589130/article/details/45692861

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!