问题: [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. STL源码剖析:迭代器

    准备知识 什么是迭代器? 迭代器是链接容器和算法的桥梁,所有的算法都通过迭代器操作容器中的数据 迭代器是一种智能指针,最重要的操作符重载就是operator*,operator-> 迭代器的实现 ...

  2. DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  3. Spring Security系列之极速入门与实践教程

    @ 目录 1. Spring Security 2. 实验环境准备 3. 日志级别修改 4. 配置用户名/密码 5. 数据库方式校验 6. 不拦截静态资源 7. 自定义登录页面 8. Remember ...

  4. BUUCTF-Web Comment

    dirsearch扫出/.git/目录 遂用航神写的Githacker脚本   https://github.com/wangyihang/githacker 出来的源码并不完整,使用git log ...

  5. 风速风向 UV 相互转换

    这里以c#为例将风的uv分量转成风向风速(别的语言类似) 风向是以y轴正方向为零度顺时针转 UV转风速风向 1 double v ;//v分量 2 double u;//u分量 3 double fx ...

  6. pandas之数值计算与统计

    数值计算与统计 对于DataFrame来说,求和.最大.最小.平均等统计方法,默认是按列进行统计,即axis = 0,如果添加参数axis = 1则会按照行进行统计. 如果存在空值,在统计时默认会忽略 ...

  7. Python三角函数

    Python三角函数: 函数: ''' math.sin(x) 返回的x弧度的正弦值. math.asin(x) 返回x的反正弦弧度值. math.cos(x) 返回x的弧度的余弦值. math.ac ...

  8. matplotlib基础汇总_02

    设置plot的风格和样式 点和线的样式 颜色 参数color或c 五种定义颜色值的方式 别名 color='r' 合法的HTML颜色名 color = 'red' HTML十六进制字符串 color ...

  9. numpy第三方库

    # 导入numpy 并赋予别名 np import numpy as np # 创建数组的常用的几种方式(列表,元组,range,arange,linspace(创建的是等差数组),zeros(全为 ...

  10. Python os.read() 方法

    概述 os.read() 方法用于从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串.高佣联盟 www.cgewang.com ...