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)) + "
}")
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))+"
}")
30 }
31 
32 func init() {
33     me = `
34 }

  可以看到代码中 红色部分和蓝色部分完全一致

第10行执行时,输出的是G 1-17 行,红色部分

第11行执行时,输出的是G 17行中的`, 黄色部分

第12行执行时,  输出的是G 17-33行,蓝色部分

第13行执行时,输出的是G 33-34行,绿色部分

  大家也可以试试其他语言

原文地址:https://www.cnblogs.com/feiquan/p/13510804.html