实现数组求和!不能用循环、不能用库函数、怎么做?

简介: 前言如果你没有可以的去刷过题或者学习算法,那么我相信很多人的心理过程都是这样一个变化:数组求和?这太简单了!...不对,不能用循环,不能用内置函数?那我咋办啊!很多小伙伴刚开始以为这道题很简单,但是仔细一看却摸不着头脑。其实这道题说难不难,说简单也不简单,主要是看你对算法的灵敏度如何了。

1.题目描述


虽然通过文章标题,我们大概能够知道这是一道数组求和的题目,但是至于数组是否固定、数组是否全是数据等等我们还需要细化一下,让这道题变得更严谨起来。


题目描述:

给定任意长度的整数数组 arr,例如[1,2,3,4,5,6],实现一个求和函数 sum,在不利用循环、标准库函数的情况下实现数组的求和。


输入:

sum([1,2,3])


输出:

6


到这里我们基本上明白题目的意思了,就是给定一个任意长度的整数数组,在某些限制条件下实现求和。


2.到底考察什么?


我们平时实现数组求和直接循环一遍就好了,实在不行借助一些内置函数也是能够实现的,但是如果我们想抛开这两项,我们还能如何操作数组呢?


很简单:我们可以直接操作数组下标!


但是问题又接踵而来了,数组长度是不固定,我们怎么知道数组下标何时没有呢?


这个时候我们又得换一个思路了,既可以使用数组下标,又不用担心长度的问题,那该用什么呢?


到这里我们不妨考虑一下递归!递归是一个比较基础但是又必要要会的算法知识,递归的实现有一点循环的意思来里面,但是它又不是循环,而且还有终止条件,也解决了我们数组长度步固定的问题。


所以本题考察的重点就是:递归!


如果还不会递归的建议去好好学习一下,因为这是算法考察中避不开的一道坎!


递归的典型案例:


我们在学习递归算法的时候,通常都是拿一道非常经典的案例来讲解:斐波那契数列。那么什么是斐波那契数列呢,我们看下面题目:

已知:1、1、2、3、5、8、13、21.....

由上可知:f(1) = 1、f(2) = 1、f(3) = 2 ......f(n) = f(n-1) + f(n-2)


上面其实就是一道数学题,当然上面的数列就是斐波那契数列,我们可以使用递归的方式求得第 n 个数的值。


代码如下:

function fib(n){
    if(n==1 || n==2){
        return 1;
    }
    return fib(n-1) + fib(n-2);
}


3.解题思路


上一节我们给出了递归解决斐波那契数列的代码,大家应该能发现,代码的本质上就是一个求和操作,而我们这里不正是想要实现数组求和吗?


我们假设数组为:[1,2,3,4,5,6]


实现数组求和无非就是数组第一位累加到最后一位,如下:

1 + 2 + 3 + 4 + 5 + 6


而我们的斐波那契数列实质上就是前面数字的累加求和,和我们的数组求和不约而合。

假如我们有一个函数 f(n)n 代表从数组坐标哪一位开始向后累加求和,那么可以设想出下列公式:

f(5) = arr[5] // 6

f(4) = f(5) + arr[4] // 6 + 5

f(3) = f(4) + arr[3] // 6 + 5 + 4

...

fn(n) = f(n+1) + arr[n]


公式我们已经推导出来了,f(n)返回的就是从数组坐标 n 开始向后的所有元素的累加和。


实现思路:


利用公式 fn(n) = f(n+1) + arr[n]实现数组求和,传入 n0,即代表数组所有元素的和。


4.代码实现


既然解题思路有了,那么我们就可以实现它了,首先来实现 f(n)函数。


代码如下:

<script>
  let arr = [1, 2, 3, 4, 5, 6];
  function f(n) {
    return n >= arr.length ? 0 : f(n + 1) + arr[n];
  }
  console.log(f(0)); // 21
  console.log(f(1)); // 20
  console.log(f(2)); // 18
</script>


上段代码我们直接把之前总结的公式带入函数了,当然多加了一个判断,如果传入的 n 大于等于数组长度了,说明到头了,无需再递归函数了,所以直接返回 0


虽然已经实现了数组的求和,但是我们题目要求是实现 sum 函数,该函数接收的是一个数组,所以我们还得封装一下。


代码如下:

<script>
  let arr = [1, 2, 3, 4, 5, 6];
  function sum(arr) {
    function f(n) {
      return n >= arr.length ? 0 : f(n + 1) + arr[n];
    }
    return f(0);
  }
  console.log(sum(arr)); // 21
</script>


到这里我们这道题目就算解决了,没有借助循环和内置函数,实现了数组的求和。


总结


递归是我们算法中很重要的一种思想,大家一定要理解它,今天这道题目其实不算难,但是如果不知道递归,估计还是无从下手吧!


那么,小伙伴们是否还有其它方法实现呢?欢迎留言!


如果觉得文章太繁琐或者没看懂,可以观看视频: 小猪课堂

相关文章
|
Linux Perl
Linux 系统快速分析日志定位故障原因的 10 个方法
在 Linux 系统中,日志是一种非常重要的资源。系统管理员可以通过日志记录的内容来检测系统的运行状况,分析问题,做出相应的调整和优化。由于日志文件数量庞大,内容复杂,因此需要使用一些工具和技术帮助管理员进行快速分析和查找。 本文将介绍 Linux 系统中快速分析日志、定位故障的 10 个方法。
3835 1
|
编解码 安全 Android开发
低功耗蓝牙LE Audio Profile 详细介绍
2019年底,蓝牙官方组织SIG发布了蓝牙5.2版本的核心协议,其中增加了一个重要的特性---LE Audio。蓝牙的应用协议都是从应用层到物理层完整包含的协议,LE Audio也不例外。但蓝牙5.2核心协议仅仅定义了蓝牙LE的链路层传输Audio的方式,上层协议以及完整的LE Audio规范迟迟未出,近日,蓝牙官方组织释放了LE Audio较为完整的规范文档。
低功耗蓝牙LE Audio Profile 详细介绍
|
资源调度 JavaScript API
uniapp项目vue2升级vue3
uniapp项目vue2升级vue3
1019 0
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
283 2
|
27天前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
256 137
|
机器学习/深度学习 编解码 测试技术
TimeMOE: 使用稀疏模型实现更大更好的时间序列预测
TimeMOE是一种新型的时间序列预测基础模型,通过稀疏混合专家(MOE)设计,在提高模型能力的同时降低了计算成本。它可以在多种时间尺度上进行预测,并且经过大规模预训练,具备出色的泛化能力。TimeMOE不仅在准确性上超越了现有模型,还在计算效率和灵活性方面表现出色,适用于各种预测任务。该模型已扩展至数十亿参数,展现了时间序列领域的缩放定律。研究结果显示,TimeMOE在多个基准测试中显著优于其他模型,特别是在零样本学习场景下。
1512 64
|
存储 缓存 数据安全/隐私保护
FGPA的简介及应用
FGPA的简介及应用
1784 2
|
11月前
|
机器学习/深度学习 人工智能 编解码
【AI系统】Transformer 模型小型化
本文介绍了几种轻量级的 Transformer 模型,旨在解决传统 Transformer 参数庞大、计算资源消耗大的问题。主要包括 **MobileVit** 和 **MobileFormer** 系列,以及 **EfficientFormer**。MobileVit 通过结合 CNN 和 Transformer 的优势,实现了轻量级视觉模型,特别适合移动设备。MobileFormer 则通过并行结构融合了 MobileNet 和 Transformer,增强了模型的局部和全局表达能力。
481 8
【AI系统】Transformer 模型小型化
|
9月前
|
人工智能 JSON 搜索推荐
猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON
猫步简历是一款免费开源的AI简历生成器,帮助用户轻松创建独特、专业的简历。支持导出超高清PDF、图片、JSON等多种格式,并提供AI智能创作、润色和多语种切换等功能。拥有海量模板、高度定制化模块及完善的后台管理系统,助力求职者脱颖而出。官网:https://maobucv.com,GitHub开源地址:https://github.com/Hacker233/resume-design。
1999 10
|
区块链
C 标准库 - <locale.h>详解
`&lt;locale.h&gt;` 是 C 标准库中的头文件,用于处理地域设置(locale),影响程序的行为,如数字、货币和日期格式化。重要类型包括 `locale_t`;宏有 `LC_ALL`、`LC_COLLATE` 等;主要函数包括 `setlocale`、`newlocale`、`frelocale`、`duplocale`、`strcoll` 和 `mblen`。
403 12