编程基本功之数组求和

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

时间: 2024-10-01 21:01:51

编程基本功之数组求和的相关文章

编程基本功之数组交叉合并

继续昨天的话题.今天的内容比较简单,数组的交错合并.问题如下 编写一个交错合并列表元素的函数.例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]. 代码参考下面的程序. 测试画面 // 取得两个数组的内容 var arrData = new Array(); arrData[0] = document.getElementById("Q2I1").value.split(","); arrData[1] = document.g

随机数组求和

题目要求: 随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路:     创建一个长度为10的double型数组,调用Java.util.Random包定义Random对象,利用方法nextInt(100);在通过for循环.Random类进行随机数赋值得到1-100间的随机数.在将数组里的数相加.最后在用JOptionPane.showMesssageDialog进行消息框输出. 程序流程图: 源程序代码: package qaq

CUDA学习:第一CUDA代码:数组求和

今天有些收获了,成功运行了数组求和代码:就是将N个数相加求和 //环境:CUDA5.0,vs2010 #include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h> cudaError_t addWithCuda(int *c, int *a); #define TOTALN 72120#define BLOCKS_PerGrid 32#define TH

Java并发和多线程2:3种方式实现数组求和

本篇演示3个数组求和的例子. 例子1:单线程例子2:多线程,同步求和(如果没有计算完成,会阻塞)例子3:多线程,异步求和(先累加已经完成的计算结果) 例子1-代码 package cn.fansunion.executorservice; public class BasicCaculator { public static long sum(int[] numbers){ long sum = 0; for(int i=0;i<numbers.length;i++){ sum += numbe

数组求和方法汇总

var arr = [1, 2, 3, 4, 5, 6];测试时我不想过度使用全局变量影响命名空间,所以没使用未声明变量.而是直接通过私有作用域设置静态私有变量,也可以用其他设计模式来限定变量作用域.因为数组对象的迭代方法也是一种遍历,所以也可以借助用来实现求和.一.利用数组对象的各迭代方法:1.array.every()查询是否有所有项都匹配的方法: 1 (function() { 2 var sum = 0; 3 4 function getSum(item, index, array) {

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

reduce实现数组求和

对于实现数组求和,我们常用的思路是通过for.while,对数组进行迭代,依次将他们的值加起来,下面列举常用的两种方法 第一种: var arr = [1,2,3,4,5,6]; Array.prototype.sum = function (){ var sumResult = 0; for (var i = 0; i < this.length; i++) { sumResult += parseInt(this[i]); } return sumResult; } arr.sum(); 第

二维数组求和

输入一个二维的整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个二维子数组,每个子数组都有一个和.求所有子数组的和的最大值. 解题思路:由于原来做的这个时间有一点久远,我记得当时的思路就是将二维数组转化为一维数组,然后利用原来的一维数组求和的方式进行计算. 源代码 package shengcheng; import java.util.Scanner; import org.junit.Test; public class Erwei { @Test public void f

编程题:数组名作为函数参数。需要根据下面要求来实现

编程题:数组名作为函数参数. 要求分析:形参和实参都是数组名,传递整个数组,形参数组与实参数组必须等同,是存放在同一空间的同一个数组.形参数组修改时,实参数组也同时被修改,否则无法运行. #include<stdio.h> void change(int x[2]) { int t; printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); t=x[0];x[0]=x[1];x[1]=t; printf("x[0]=%d,x[1]=%d\n&q