# 2626. Array Reduce Transformation
###### tags:`Array` | `leetCode`
<font color="#01AE9A" background="E1F3F0">`easy`</font>
### 題目
Given an integer array nums, a reducer function fn, and an initial value init, return a reduced array.
A reduced array is created by applying the following operation: val = fn(init, nums[0]), val = fn(val, nums[1]), val = fn(val, nums[2]), ... until every element in the array has been processed. The final value of val is returned.
If the length of the array is 0, it should return init.
Please solve it without using the built-in Array.reduce method.
### Example
```javascript=
Input:
nums = [1,2,3,4]
fn = function sum(accum, curr) { return accum + curr; }
init = 0
Output: 10
Explanation:
initially, the value is init=0.
(0) + nums[0] = 1
(1) + nums[1] = 3
(3) + nums[2] = 6
(6) + nums[3] = 10
The final answer is 10.
```
```javascript=
Input:
nums = [1,2,3,4]
fn = function sum(accum, curr) { return accum + curr * curr; }
init = 100
Output: 130
Explanation:
initially, the value is init=100.
(100) + nums[0]^2 = 101
(101) + nums[1]^2 = 105
(105) + nums[2]^2 = 114
(114) + nums[3]^2 = 130
The final answer is 130.
```
```javascript=
Input:
nums = []
fn = function sum(accum, curr) { return 0; }
init = 25
Output: 25
Explanation: For empty arrays, the answer is always init.
```
### Constraints
- `0 <= nums.length <= 1000`
- `0 <= nums[i] <= 1000`
- `0 <= init <= 1000`
---
### 解題邏輯
這題函式接受一個數字 `arr`,`callback function` 和 `init`當作參數,每個 curr 經過 `function` 裡面的作用後 return 出來
以範例一為例:
```javascript=
Input:
nums = [1,2,3,4]
fn = function sum(accum, curr) { return accum + curr; }
init = 0
Output: 10
Explanation:
initially, the value is init=0.
(0) + nums[0] = 1
(1) + nums[1] = 3
(3) + nums[2] = 6
(6) + nums[3] = 10
The final answer is 10.
```
看到遍歷每個元素大概就知道會有個 `for-loop` ,當迴圈跑第一次會產出 `init`+`num`的第一個元素,第二次則是第一次的答案加上第二個元素...以此類推
解釋完題目就進入實作吧!
### 來看看第一直覺的想法
```javascript=
var reduce = function(nums, fn, init) {
let result = 0
for(let i = 0;i<nums.length;i++){
result += fn(0,nums[i])
}
return result +init
};
```
這個寫法跑前三個側向的是通過的,正想說怎麼這麼順利時,submit 後就QQ了
```javascript=
[0]
function sum(accum, curr) { return 0; }
init: 25
output: 25
expect: 0
```
我們把 result 印出來看看
```javascript=
var reduce = function(nums, fn, init) {
let result = 0
for(let i = 0;i<nums.length;i++){
result += fn(0,nums[i])
console.log("result",result)// 0
}
return result +init //25
};
```
看起來 init 不應該加在 return 後,應該是直接把 result return 出來才對
```javascript=
var reduce = function(nums, fn, init) {
let result = 0
for(let i = 0;i<nums.length;i++){
result += fn(0,nums[i])
console.log("result",result)//0
}
return result //0
};
```
通過了~~
```javascript=
==ACCEPT!==
[0]
function sum(accum, curr) { return 0; }
init: 25
output: 0
expect: 0
```
痾但是又有其他側向失敗了
```javascript=
==WRONG ANSWER!==
[1,2,3,4]
function sum(accum, curr) { return accum + curr * curr; }
init:100
output:30
expect:130
```
看起來是少加上了 init,那我們就把 init 賦值給一開始的 result
```javascript=
var reduce = function(nums, fn, init) {
let result = init
for(let i = 0;i<nums.length;i++){
result += fn(0,nums[i])
console.log("result",result)//0
}
return result //0
};
```
```javascript=
==WRONG ANSWER!==
[0]
function sum(accum, curr) { return 0; }
init:25
Output:25
Expected:0
```
### 讓我們來理解一下
fn 的 return 是 0,result 只是一直加0的話,result 本身並不會被fn作用到,所以應該把 result 放進 fn 裡
```javascript=
var reduce = function(nums, fn, init) {
let result = init
for(let i = 0;i<nums.length;i++){
result = fn(result,nums[i])
}
return result
};
```
