日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

柯里化

發布時間:2023/12/13 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 柯里化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是柯里化

  f(x)和g(x)合成為f(g(x)),有一個隱藏的前提,就是f和g都只能接受一個參數,如果可以接收多個參數,比如 f(x, y) 和 g(a, b, c),函數合成就非常麻煩了。

  這時就需要使用到函數柯里化了,所謂的“柯里化”,就是把一個多參數的函數,轉化為單參數函數。如下:

// 柯里化之前
function add(x, y) {
  return x + y;
}

add(1, 2) // 3

// 柯里化之后
function addX(y) {
  return function (x) {
    return x + y;
  };
}

addX(2)(1) // 3

  有了柯里化之后, 我們就能夠做到,所有函數都只接受一個參數。

  






  函數柯里化又稱為部分求值,就是不會立即求值,而是等到了需要的時候再去求值。

  有這樣的一個場景,記錄程序員一個月的加班總時間,那么好,我們首先要做的就是記錄程序員每天加班的時間,然后把一個月中每天加班的時間相加,這樣,就得到了一個月的加班總時間。


問題來了,我們又很多方法來實現,比如最簡單的:

    var monthTime = 0;
    function overtime(time) {
      return monthTime += time;
    }

    overtime(3.5); // 第一天
    overtime(4.5); // 第二天
    overtime(2.2); // 第三天
    //...
    //
    //
    //
    overtime(3.2); // 第三十天

    console.log(monthTime);

這個思路應該是最簡單的,就是一個函數,變量時monthTime,每天加上加班小時數之后返回總的加班時間。

每次傳入加班時間都進行累加,這樣當然沒問題,但你知道,如果數據量很大的情況下,這樣會大大犧牲性能。

那怎么辦?這就是柯里化要解決的問題。

其實我們不必每天都計算加班時間只需要保存好每天的加班時間,在月底時計算這個月總共的加班時間,所以,其實只需要在月底計算一次就行

即對于每次輸入的時間,我們只需要保存起來即可,這樣,沒有了加法返回的步驟,就可以減少運算了。

如下所示的overtime函數還不是一個柯里化函數的完整實現,但是可以幫助我們了解其中的核心思想了:

這里的思想非常簡單, 就是如果傳入了參數,那么就把這個參數push到args數組中,表明這是在累加的階段; 如果沒有傳入參數,那么就說明已經加完了,只要最后一次求和即可。 關鍵是這個overtime函數返回的是一個函數。 這里需要注意。如下:

  var overtime = (function () {
      var days = [];
      return function () {
        if (arguments.length == 1) {
          [].push.apply(days, arguments);
        } else {
          var total = 0;
          for (var i = 0; i < days.length; i++) {
            total += days[i];
          }
          console.log(total);
          return total;
        }
      }
    })();


    overtime(1);
    overtime(2);
    overtime(3);
    overtime(4);
    overtime(); // 10

即對于前面的四個overtime函數被調用的時候,其實只是保存了變量而已,并沒有求值,直到最后才一起求值,這樣有利于提高效率。

https://rockjins.js.org/2017/02/15/2017-02-15-curring-uncurring/

總結

以上是生活随笔為你收集整理的柯里化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。