golang 遞歸自己,輸出自己的源代碼

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

 

  大家也可以試試其他語言

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章