神奇的函數緩存.媽媽再也不用擔心遞歸類函數跑不快了
.
原作者:祁宇
.ppt下載地址:在此
真的非常神奇!
元<型名 R,型名...A>
函數<R(A...)>緩存(R(*針)(A...)){
靜 映<元組<A...>,R>啊;
打印("啊",啊.大小());
中[=](A...o){//這是最後執行的函數
元組<A...>t(o...);動 m=啊.查找(t);
如(m==啊.尾())啊[t]=針(o...);
打印("啊",啊.大小());
中 啊[t];
};//[=]不能換,*一換就出錯*,必須要把所有指針傳出去,所以,要用=號,否則要出問題
//一直用的是這個內部函數,同一個函數.所以啊0只打印了一次
}//返回的是f函數,這個玩意兒還是高級貨非常厲害的
元<型名 R,型名...A>
動 快計(R(*針)(A...)){//每一個函數都保存了的
用 函=函數<R(A...)>;靜 無序映<推導(針),函>呀;
動 p=呀.查找(針);
如(p==呀.尾())壓(呀,針,緩存(針));//就是這裏
//打印("呀",呀.大小());//通過這裏可以知道,這裏只緩衝了一個,所以沒必要用無序映.
中 呀[針];
//針,變成緩存針了,對不,這個p還沒變化
//查到針的,然後壓進去了.每次在緩存這裏變化
//直接返回的呀[針]
}//返回的是函數,這個函數針與參數結合,返回已存儲值
//多適用於函數不變,參數不變的遞歸函數
//快計,快速計算.有緩衝的計算
測試:
整 f(整 i){中(i<2)?i:f(i-1)+f(i-2);}
整 g(整 i){
中(i<2)?i:快計(g)(i-1)+快計(g)(i-2);
}
空 測試1(){
計時器 t;
整 n=g(38);
輸出<<n;
t.看();
}//開始還懷疑出錯了.
空 測試(){
計時器 t;
整 n=f(38);
輸出<<n;
t.看();
}
空 主(){
測試();
測試1();
}