小编jet*_*ero的帖子

您最喜欢的语言如何处理深度递归?

我最近开始学习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

21
推荐指数
2
解决办法
6570
查看次数

如何在filter-branch --subdirectory-filter之后从我的repo中删除不需要的对象

我正在使用

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.好像我应该仍然能够做我想做的事情.

git

8
推荐指数
1
解决办法
4381
查看次数

Java,套接字,BufferedReader和readline挂起...... :(

我根本不是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来调试这个.

java sockets

5
推荐指数
2
解决办法
1万
查看次数