zoukankan      html  css  js  c++  java
  • 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行,绿色部分

      大家也可以试试其他语言

  • 相关阅读:
    POJ 1003 解题报告
    POJ 1004 解题报告
    POJ-1002 解题报告
    vi--文本编辑常用快捷键之光标移动
    常用图表工具
    September 05th 2017 Week 36th Tuesday
    September 04th 2017 Week 36th Monday
    September 03rd 2017 Week 36th Sunday
    September 02nd 2017 Week 35th Saturday
    September 01st 2017 Week 35th Friday
  • 原文地址:https://www.cnblogs.com/feiquan/p/13510804.html
Copyright © 2011-2022 走看看