iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
Software Development

LeetCode-30 Days of JavaScript系列 第 8

LeetCode JS30-Day08 | 組合函式 2629. Function Composition

  • 分享至 

  • xImage
  •  

Day08 - 組合函式 2629. Function Composition EASY

Description❓

Given an array of functions [f1, f2, f3, ..., fn], return a new function fn that is the function composition of the array of functions.

The function composition of [f(x), g(x), h(x)] is fn(x) = f(g(h(x))).

The function composition of an empty list of functions is the identity function f(x) = x.

You may assume each function in the array accepts one integer as input and returns one integer as output.

接受一個函數陣列[f1, f2, f3, ..., fn]作為參數,返回一個新函數fn,它是函數陣列的函數組合。
[f(x), g(x), h(x)] 的函數組成為 fn(x) = f(g(h(x)))
空函數列表的函數組合是恆等函數 f(x) = x
您可以假設數組中的每個函數接受一個整數作為輸入並返回一個整數作為輸出。

Points

Solution✍️

[ ▶️挑戰這一題 ][ 本日代碼 ]

使用 for迴圈 遞減的寫法

  1. 宣告一個函式compose作為組合陣列的方法,而它的參數則為函式陣列functions
  2. 如果functions是空陣列,則返回恆等函數 (x)=>x。
function compose(functions) {
   if (functions.length === 0) {
      return (x) => x;
   }

   //調用函式陣列的邏輯
}
  1. 撰寫調用函式陣列的邏輯:初次迭代的參數為x,第二次迭代的參數是上一次調用函式的result,並將它做為參數代入下一個陣列元素的函式中,函式應從函式陣列的最後一項開始調用。
  2. 設計一個 for遞減循環 (for(初始,判斷,迭代)),陣列最後一個元素開始遍歷到第一項元素,由於希望從陣列最後一項Array[index]開始,陣列中末項元素的索引indexArray.lenth-1求出。
function compose(functions) {
   if (functions.length === 0) {
      return (x) => x;
   }

   return function (x) {
      let result = x;

      for (let i = functions.length - 1; i >= 0; i--) {
         result = functions[i](result);
      }
      return result;
   };
}

使用 Array.reduceRight() 的寫法

  • 使用 reduceRight 循環,從陣列最後一個元素開始遍歷到第一項元素。
  • 累加的初始參數是x,代入迭代的currentFunction後,返還result作為下一次函式的參數。
function compose(functions) {
   return function (x) {
      return functions.reduceRight((result, currentFunction) => {
         return currentFunction(result);
      }, x);
   };
}

Testcase

let functionsX = [x => x + 1, x => x * x, x => 2 * x];
let x = 4;
const composedFunction = compose(functionsX);
const result = composedFunction(x);
console.log(result);
let functionsY = [y => 10 * y, y => 10 * y, y => 10 * y];
let y = 1;
const composedFunctionY = compose(functionsY);
const resultY = composedFunctionY(y);
console.log(resultY);
let functionsZ = [];
let z = 42;
const composedFunctionZ = compose(functionsZ);
const resultZ = composedFunctionZ(z);
console.log(resultZ);

上一篇
LeetCode JS30-Day07 | 陣列 Array.reduce() - 2626. Array Reduce Transformation
下一篇
LeetCode JS30-Day09 | 2703. Return Length of Arguments Passed 認識剩餘參數
系列文
LeetCode-30 Days of JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言