golang 遞迴自己,輸出自己的原始碼

feiquan發表於2020-08-15

問題: [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行,綠色部分

 

  大家也可以試試其他語言

 

相關文章