問題: [2min 大家自己想想]
一個程式P執行後能否輸出自己的原始碼?並且格式保持一致(換行、空格等)
思考:
這個問題的本質是一個遞迴問題,設有P執行後生成G 既P->G && P==G:
1. P 中需要設定一個字串 me 來存放自己的原始碼
2. P.me 的賦值內容為 P 原始檔開頭到 P.me 所在行(P 中藍色部分和紅色部分相同), 此時 P.me 中的內容是G的開頭到 G.me 賦值的原始碼 (G中紅色部分)
3. P然後繼續列印出G.me 賦值的內容(G中藍色部分)
這樣的話就需要保證 P中 print me 在前,me 的賦值在後即可,而剛好我們可以想到golang 中init 函式先於main 函式執行而與所在行的前後無關,所以我們可以將P.me 的賦值放init 中,行數大於main 的所在行數, 這樣在為P.me 賦值時 P中的原始碼已經確定了
原始碼:
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 var me string 8 9 func main() { 10 fmt.Print(me) 11 fmt.Print(string(rune(96))) 12 fmt.Print(me) 13 fmt.Print(string(rune(96)) + "\n}") 14 } 15 16 func init() { 17 me = `package main 18 19 import ( 20 "fmt" 21 ) 22 23 var me string 24 25 func main() { 26 fmt.Print(me) 27 fmt.Print(string(rune(96))) 28 fmt.Print(me) 29 fmt.Print(string(rune(96))+"\n}") 30 } 31 32 func init() { 33 me = ` 34 }
可以看到程式碼中 紅色部分和藍色部分完全一致
第10行執行時,輸出的是G 1-17 行,紅色部分
第11行執行時,輸出的是G 17行中的`, 黃色部分
第12行執行時, 輸出的是G 17-33行,藍色部分
第13行執行時,輸出的是G 33-34行,綠色部分
大家也可以試試其他語言