编程基本功之数组求和

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

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


  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田辛 | 田豆芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值