什么是CPS


 

什么是CPS

在函數式編程中,CPS (Continuation-Passing Style)是一種編程風格:所有的控制塊都通過 continuation 來顯式傳遞。簡單來說,在CPS風格中,函數不能有返回語句,它的調用者要想獲得它的結果,需要顯式傳遞一個回調函數來獲取結果並繼續執行。而為了保證整個程序執行下去,這個回調函數還會一直嵌套下去。這里的回調函數就是一個“continuation”。暫時找不到好的翻譯,就保留它的原文。

下面來看一個遞歸的例子,比如常見的計算數學階乘的函數:

// 原來代碼
function fact(n) {
if (n == 0)
return 1 ;
else
return n * fact(n-1) ;
}

// CPS風格代碼
function fact(n,ret) {
if (n == 0)
ret(1) ;
else
fact(n-1, function (t0) {
ret(n * t0) }) ;
}

// 調用入口
fact (5, function (n) {
console.log(n) ; // Output 120
})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
上面是傳統的遞歸實現,下面是CPS風格的實現。可以看到return語句被替換成一個回調函數的調用,而相乘這個動作會在接下來的遞歸里通過嵌套的回調函數完成,直到終止條件。你可以理解為,在每一層的遞歸中,回調函數都會給參數多乘上一個系數,並調用上一層的回調函數,直到最外層打印結果。
————————————————
版權聲明:本文為CSDN博主「擇思」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jaytalent/article/details/105425616


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM