作者yauhh (喲)
看板C_and_CPP
標題Re: [問題] 可否用數學表達?
時間Wed Oct 20 10:45:02 2010
※ 引述《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