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行,绿色部分

      大家也可以试试其他语言

  • 相关阅读:
    chkconfig: command not found
    MySQL之存储过程和函数
    MySQL之级联删除、级联更新、级联置空
    MySQL 视图
    解决创客学院小黄书的错
    C语言的一小步—————— 一些小项目及解析
    C基础的练习集及测试答案(提高题)
    C基础的练习集及测试答案(40-50)
    C基础的练习集及测试答案(31-39)
    C基础的练习集及测试答案(16-30)
  • 原文地址:https://www.cnblogs.com/feiquan/p/13510804.html
Copyright © 2011-2022 走看看