我认为这可能是一个经典的问题,但我不知道答案的。 可以在程序输出自身的副本,并且,如果是这样,有一个简短的程序,这是否?
我不接受“空计划”作为回答,我不接受访问有自己的源代码程序。 相反,我想是这样的:
int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...
但我不知道该怎么继续?
我认为这可能是一个经典的问题,但我不知道答案的。 可以在程序输出自身的副本,并且,如果是这样,有一个简短的程序,这是否?
我不接受“空计划”作为回答,我不接受访问有自己的源代码程序。 相反,我想是这样的:
int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...
但我不知道该怎么继续?
最基内斯的基本思路是:
你写的代码,需要一个字符串字面s
并打印,而在更换出现(或发生 )的特殊foo字符串的s
的价值s
本身。
你把计划至今的全部源代码,并用它作为定义s
。 但要排除的定义 s
从字符串 ,而不是由富替换它。
嗯,这是一般的想法。 剩下的就是字符串格式化的细节,真的。
它被称为奎因 ,并有一个网站,收集他们 。
这就是所谓的奎因 :
甲喹是一种计算机程序,其不采取任何输入,并产生它自己的源代码的副本作为其唯一的输出。 在可计算性理论和计算机科学文献这些程序中的标准条款是自我复制程序,自我复制程序,和自我复制的程序。
quine指的执行环境的一个固定点,当执行环境被视为一个函数。 基内斯在任何图灵完备的编程语言是可能的,如克林的递归定理的一个直接后果。 对于娱乐,有时程序员试图发展在任何给定的编程语言最短的奎因。
来源:维基百科
这确实是一个经典的问题!
除了特定的存在基内斯 ,在可计算性理论的一个重要结果是,你可能要计算任何功能,存在一个程序,“知道自己的方案文本”,即如果需要,可以打印本身。 这个定理被称为克林第二递归定理 。
是。 下面是做它,我20年前写了一个C程序。
http://womencht.reocities.com/Athens/8994/repeat.html
如果你写了奎因,要小心的是,副本不也写自己无穷的副本,并最终接管世界。
在通过乔恩斯基特发明的语言下面的操作打印“你好,世界!\ n”。
h
我可以让这个语言的修改,使下面的程序打印“Hello,世界\ N!”:
Hello, world!
所以这是一个打印本身的程序。
哦,你觉得有什么奇怪的是,虽然它具有精确和正确的数学定义是什么? 那是你的问题。 “我不会接受。”哈哈! 数学不接受,她是我所服务的情妇,所以我发布这个答案。
我假设你允许解释型语言。 (在一定程度上,所有的语言解释。)有人写解释,如果你正在写它,你可以给它添加任何你喜欢的内置功能,如(lispy)函数(foo)
,什么也不做,除了打印“ (foo)
”。
或者你也可以添加更加复杂的宏观型功能(printMeAndMyArgs ...)
因此,关键是如何定义的问题。
迈克尔·西蓬瑟的“介绍计算理论”解释了章如何构建一个奎因之一。 我最近写基于这种想法Java程序,并张贴在: http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/
我建议你这本书的保持和尝试推行自己的计划在您喜欢的语言。 有很多在这本书中其他有趣的定理。
-kiran
// save it as file.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
system("cat file.cpp");
return 0;
}
这是可能在Java中,但也有一些限制。
我已经写在一个简单的Java代码,它打印本身。 您可以使用C / C ++的文字使用相同的程序。 您可以添加你想要这个程序中做任何事,它会完全打印本身。
条件
Java的文件应该是没有任何包装内
文件夹结构不应该包含空格的任何文件夹在其名称中
编译的目标应该是默认或同一文件夹中的java文件驻留
import java.io.FileInputStream; import java.net.URL; public class PrintYourself { public static void main(String[] args) { // TODO Auto-generated method stub URL location = PrintYourself.class.getProtectionDomain().getCodeSource().getLocation(); String path=location.getFile(); path=path.replace("/bin", "/src"); System.out.println(path); try{ FileInputStream st=new FileInputStream(path+"PrintYourself.java"); int i=0; while((i=st.read())!=-1){ System.out.print((char)i); } st.close(); } catch(Exception e){ System.out.println(e); } } }