每天一个面试题(4) 来自字节跳动的面试题--关于算法的考察--使用递归的方法求和

126 阅读1分钟

要求 : 数组求和,不允许使用循环,不允许使用标准库的函数

简单分析:

 const arr [ 5,1,3,6,2]
f(i) 表示 从数组第 i 位到末尾之和
f(2)  表示 从数组第 2 位到末尾之和   求 3+6+2
f(3)  表示 从数组第 3 位到末尾之和   求 6+2
 f(i) 和 f(i+1) 的关系?

 //比如 : f(2) 和 f(3) 的关系 :
        f(2) = arr[2] + f(3)
// 那么 f(i) 和 f(i+1)的关系就为 :
        f(i) = arr[i] + f(i+1)
但是这样是有缺陷的
 就是当 i 大于等于了数组的长度之后,也就是它超过了最大的下标 就不能求和了 
 这个时候就认为 f(i) 应该等于 0 
  当 i >= arr.lengthf(i) = 0

当分析到这来之后 ,就可以计算开头要求的题了

要求 : 数组求和,不允许使用循环,不允许使用标准库的函数

const arr= [5,1,3,6,2]
function f(i){
  // 因为不能使用循环和不允许使用标准库的函数 就直接return
  // 这时得到的结果无非就是两种 :
  // 1. i 大于等于数组的长度 ,超过了最大数组的下标
  // 2. 正常情况
  return i >= arr.length ? 0 : arr[i] + f(i+1) 
}
//当从下标0开始到末尾
console.log(f(0))
输出结果为  :  17 

当等到一个数组时

function res(arr) {
  function f(i){
    return i >= arr.length ? 0 : arr[i] + f(i+1) 
  }
  return f(0)
}
// 求一个空数组和 res数组
console.log(res([]) , res([1,2,3])) 
// 打印结果为:  0   6

这个题考察的并不是数组求和,而是能否熟练灵活使用递归,是否会算法