问题: [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中的源代码已经确定了

  

源代码:

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

  大家也可以试试其他语言

golang 递归自己,输出自己的源代码的更多相关文章

  1. Golang的格式化输出fmt.Printf

    本文来源:Go by example. Golang的格式化输出 和 C语言的标准输出基本一样,但是增加了一些针对Golang语言的特有数据结构的格式化输出方式. 一下就是实例: package ma ...

  2. [golang]golang如何覆盖输出console,实现进度条;golang一个骚气的进度提示库

    [golang]golang如何覆盖输出console,实现进度条 package main import( "fmt" "os" "time&quo ...

  3. 汉诺塔算法的递归与非递归的C以及C++源代码

    汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...

  4. C语言---递归反向输出任意长度的字符串

    (该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...

  5. Python3:递归实现输出目录下所有的文件

    今天来整理一下os库中方法的使用,如何输出一个目录下的所有文件? 1.首先介绍几个基本的的方法: 1)os.getcwd()  #返回当前工作目录 2)os.listdir()    #返回一个列表, ...

  6. IO流——递归(输出所有文件)

    package pers.zbb.File; import java.io.File; public class FileDemo { public static void main(String[] ...

  7. Java基础知识强化之IO流笔记14:递归之输出指定目录下所有java文件绝对路径的案例

    1. 需求:输出指定目录下的所以.java结尾文件的绝对路径的案例:  分析:  A:封装目录  B:获取该目录下的所有文件和文件夹的File数组  C:遍历这个File数组,得到每一个File对象的 ...

  8. Python3基础 response.read 输出网页的源代码

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. golang 并发顺序输出数字

    参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { va ...

随机推荐

  1. 一个调用其他activity的完整例子,使用了 onActivityResult和startActivityForResult

    https://blog.csdn.net/qq_32521313/article/details/52451364 Android startActivityForResult基本用法2016年09 ...

  2. 动态规划入门(dp)

    dp的基本思想,是把大问题转化成一个个小问题,然后递归解决. 所以本质思想的话还是递归. dp最重要的是要找到状态转移方程,也就是把大问题化解的过程. 举个例子 一个数字金字塔 在上面的数字三角形中寻 ...

  3. c++ string 类型 大小写转换 

    还是用以前的库函数就行的,toupper(int c)小写变大写和tolower(int c)大写变小写 可以直接这么干 string s = "ABCDEFG"; for( in ...

  4. MacOS英语学习

    总结于B站Mac云课堂:https://www.bilibili.com/video/BV1vf4y1U7SZ 各个软件的链接: Edge:https://www.microsoft.com/zh-c ...

  5. Python long() 函数

    描述 long() 函数将数字或字符串转换为一个长整型.高佣联盟 www.cgewang.com 语法 long() 函数语法: class long(x, base=10) 参数 x -- 字符串或 ...

  6. PHP set_file_buffer() 函数

    定义和用法 set_file_buffer() 函数设置打开文件的缓冲大小. 使用 fwrite() 函数输出结果,缓冲的大小通常为 8K.因此,如果要将两个进程写入同一个文件,那么每个文件一次最多只 ...

  7. CentOS中配置NFS

    https://www.cnblogs.com/yeungchie/ NFS是Network File System的缩写,即网络文件系统. 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间 ...

  8. 牛客练习赛63 C 牛牛的揠苗助长 主席树 二分 中位数

    LINK:牛牛的揠苗助长 题目很水 不过做法很多 想到一个近乎O(n)的做法 不过感觉假了 最后决定莽一个主席树 当然 平衡树也行. 容易想到 答案为ans天 那么一些点的有效增长项数为 ans%n. ...

  9. 4.23 子集 分数规划 二分 贪心 set 单峰函数 三分

    思维题. 显然考虑爆搜.然后考虑n^2能做不能. 容易想到枚举中间的数字mid 然后往mid两边加数字 使其整个集合权值最大. 这里有一个比较显然的贪心就不再赘述了. 可以发现这样做对于集合是奇数的时 ...

  10. JVM科普

    目录 再看前言 不完美的程序 Java发展史 JVM族谱 什么是广义的虚拟机? 什么是Java虚拟机(JVM)? 二刷周先生的<深入理解JVM>时,没想到已经出了第三版,拿着第二版的我在风 ...