遞歸宏是否存在?
雖然缺少宏C/C中固有的遞歸能力,但存在一條實現的路徑類似遞歸的行為。使用延遲表達式和間接定址的組合,可以建立模擬遞歸的複雜巨集。
它是如何運作的
要製作遞歸宏,我們必須擁抱多重步驟過程:
範例:遞歸重複宏
這是遞歸重複宏的說明:
#define REPEAT(count, macro, ...) \ WHEN(count) \ ( \ OBSTRUCT(REPEAT_INDIRECT) () \ ( \ DEC(count), macro, __VA_ARGS__ \ ) \ OBSTRUCT(macro) \ ( \ DEC(count), __VA_ARGS__ \ ) \ )
此巨集可以是像這樣呼叫this:
EVAL(REPEAT(8, M, ~)) // Outputs: 0 1 2 3 4 5 6 7
範例執行問題
您提供的程式碼:
# define pr(n) ((n==1)? 1 : pr(n-1)) void main () { int a=5; cout<<"result: "<< pr(5) <<endl; getch(); }
由於遞歸宏問題而無法執行。 pr 宏僅依賴遞歸,導致無限擴展。
解決方案
要解決此問題,您可以使用以下巨集的非遞歸版本:
#define fact(n) ((n == 1)? 1 : n * fact(n - 1))
以上是C/C 中可以實作遞歸巨集嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!