看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《ppttcc (ppttcc)》之銘言: : 例如,if-else這種敘述用 : bool=1, L=M : =0, L!=M : 像這樣的方式轉換, : 那像for,while,設定敘述,總之所有的c/c++ : 語法通通用(或盡可能)數學表達,是否有可能? === If-else === 數學表達是 f(B) = S, if B != 0 f(B) = S', if B = 0 程式寫成 int a = 1; // or 0 (a) && ( printf("Run true part:\n") , printf("Some tasks.\n") ); (!a) && ( printf("Run false part:\n") , printf("Other tasks.\n") ); 輸出: Run true part: Some tasks. 這樣很簡單. 難的在以下... === for 迴圈 === 數學表達是 f(I,N,S) = f(g(I),N,h(I,S)), if I < N f(I,N,S) = _, if I >= N g 是索引 I 的升階函數, S 是受迴圈影響的狀態, h 函數參考 I 而將狀態 S 改變. 程式比較難寫,基本要寫成: for_loop: (i >= n) || ( printf("Run for context #%d.\n", i) , i = i + 1 , goto for_loop ); 可是 C 語言遇到像 goto, return 之類的關鍵字,語法都要在區塊中獨自列為一句, 不可以寫成表達式. 而前處理器的巨集命令又不好寫遞迴... 那就只好用遞迴函數了. 遞迴函數定義本來就是很有數學味道的東西: int main() { int for_loop(int *i, int n); int i = 0, n = 3; (i >= n) || for_loop(&i, n); return 0; } for_loop(int *i, int n) { printf("Run `for` context #%d.\n", *i); *i = *i + 1; (*i < n) && for_loop(i, n); return 0; } 輸出: Run `for` context #0. Run `for` context #1. Run `for` context #2. 有個麻煩之處是, for 迴圈經常要處理一些狀態,所以如果用函數表示,要把其他會用到 的變數也帶進參數中. 而且,包括索引值在內,狀態改變必須要反應到呼叫方,所以幾乎 都要用傳址呼叫. 參考外部狀態的部份,以下有一個例子,由 while 迴圈參考到這裡的 變數 i. === while 迴圈 === 數學表達是 f(B,S) = f(g(B),h(B,S)), if B = true f(B,S) = _, if B = false 程式表達為 int main() { int i = 0, n = 3; ...... int while_loop(int *b, int *n); int b = 1; (!b) || while_loop(&b, &i); return 0; } int while_loop(int *b, int *n) { printf("Run while context.\n"); (*n >= 3) && (*b = 0); (*b) && while_loop(b, n); return 0; } 輸出為: Run while context. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.21.94.199
purpose:好難 10/20 10:49
xatier:大量的使用了短路 10/20 17:57