我最近开始学习Python,我很惊讶地发现1000深度递归限制(默认情况下).如果你把它设置得足够高,大约30000,就会像C一样崩溃.但是,C似乎要高得多.
(Python人员很快指出,你总是可以将递归函数转换为迭代函数,并且它们总是更快.这是100%正确.但这不是我的问题所在.)
我在Perl中尝试了相同的实验,并且在大约1000万次递归中它消耗了我所有的4个ram并且我使用了^ C来停止尝试.显然,Perl不使用C堆栈,但它在执行时会使用大量的内存 - 考虑到调用函数需要做多少工作,这并不是非常令人震惊.
我在Pike尝试过,并且在大约2秒钟内完成100,000,000次递归完全感到惊讶.我不知道它是如何做到的,但我怀疑它将递归转换为迭代过程 - 它似乎没有消耗任何额外的内存.[注意:Pike确实会使琐碎的案件变得扁平化,但是对于更复杂的案件会发生段错误,或者我被告知.]
我使用了这些无用的功能:
int f(int i, int l) { if(i<l) return f(i+1,l); return i; }
sub f { return f($_[0]+1, $_[1]) if $_[0]<$_[1]; return $_[0] };
def f(i,l):
   if i<l:
     return f(i+1,l)
   return i
Run Code Online (Sandbox Code Playgroud)
我很好奇其他语言(例如,PHP,Ruby,Java,Lua,Ocaml,Haskell)如何处理递归以及它们为何如此处理它.另外,请注意,如果函数是"尾递归"(请参阅注释),它是否会有所不同.
language-agnostic recursion language-features language-design
我正在使用
git filter-branch --subdirectory-filter dir/name -- --all
Run Code Online (Sandbox Code Playgroud)
建立一个仅具有与该目录/名称相关的历史的回购.在我进行过滤之前,我将原始repo(非常大)复制到tmp目录中.在filter-branch之后,repo看起来就像我想要的那样,有一个例外:它似乎仍然包含原始repo中的所有对象,即使它们没有显示在"git log"中.
如何完全删除所有不需要的对象?
我尝试过这样的事情:
git reflog expire --expire=now --all
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)
我很清楚,我不知道他们为什么还在那里或者删除它们意味着什么,但我肯定愿意.与我有关的一些可能相关的信息是我在我的源代码库上做了一个git repack -a,它似乎将该packfile复制到新的repo.好像我应该仍然能够做我想做的事情.
我根本不是Java程序员.我试图不惜一切代价避免它,但是我需要将它用于一个班级(在学校意义上).老师要求我们使用Socket(),BufferedReader(),PrintWriter()和其他各种东西,包括BufferedReader()的readLine()方法.
基本上,这是我遇到的问题.文档清楚地指出readLine应该在输入流的末尾返回一个null,但这不是正在发生的事情.
Socket link       = new Socket(this.address, 80);
BufferedReader in = new BufferedReader( new InputStreamReader( link.getInputStream() ));
PrintWriter   out = new PrintWriter(    new PrintWriter(       link.getOutputStream(), true ));
out.print("GET blah blah blah"); // http request by hand
out.flush(); // send the get please
while( (s=in.readLine()) != null ) {
    // prints the html correctly, hooray!!
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
我得到一个空白行,一个0和另一个空白行,然后下一个in.readLine()永远挂起,而不是在HTML的结尾处完成.为什么?哪里是我的空?
我试过out.close()看看是否有Yahoo! 正在做一个持久的http会话或其他东西(我不认为没有我们愿意这样做的标题).
我在网上找到的所有Java套接字示例似乎都表明while循环是正确的形式.我只是不知道足够的Java来调试这个.