标签: recursion

如何[递归]在PHP中压缩目录?

目录是这样的:

home/
    file1.html
    file2.html
Another_Dir/
    file8.html
    Sub_Dir/
        file19.html
Run Code Online (Sandbox Code Playgroud)

我使用PHPMyAdmin中使用的相同PHP Zip类http://trac.seagullproject.org/browser/branches/0.6-bugfix/lib/other/Zip.php.我不确定如何压缩目录而不仅仅是文件.这是我到目前为止所拥有的:

$aFiles = $this->da->getDirTree($target);
/* $aFiles is something like, path => filetime
Array
(
    [home] => 
    [home/file1.html] => 1251280379
    [home/file2.html] => 1251280377
    etc...
)

*/
$zip = & new Zip();
foreach( $aFiles as $fileLocation => $time ){
    $file = $target . "/" . $fileLocation;
    if ( is_file($file) ){
        $buffer = file_get_contents($file);
        $zip->addFile($buffer, $fileLocation);
    }
}
THEN_SOME_PHP_CLASS::toDownloadData($zip); // this bit works ok
Run Code Online (Sandbox Code Playgroud)

但是当我尝试解压缩相应的下载zip文件时,我得到"不允许操作"

这个错误只发生在我尝试解压缩我的mac时,当我通过命令行解压缩文件解压缩时.我是否需要在下载时发送特定的内容类型,目前为'application/zip'

php directory recursion zip directory-structure

117
推荐指数
3
解决办法
10万
查看次数

递归是一个特征吗?

......还是只是一种做法?

我问这个是因为与我的教授争吵:我因为我们没有在课堂上报道递归而递归调用一个函数而失去了信誉,我的论点是我们通过学习return和方法隐式地学习它.

我在这里问,因为我怀疑有人有明确的答案.

例如,以下两种方法有什么区别:

public static void a() {
    return a();
    }

public static void b() {
    return a();
    }
Run Code Online (Sandbox Code Playgroud)

除了" a永远长存"(在实际的程序是正确使用时输入的内容无效,再次提示用户),有没有之间的任何根本区别ab?对于未经优化的编译器,它们如何以不同方式处理?

归根结底,通过学习可以归结为是否return a()b我们为此还学会了return a()a.我们呢?

recursion

116
推荐指数
8
解决办法
5863
查看次数

了解递归函数的工作原理

正如标题所解释的那样,我有一个非常基本的编程问题,我还没有能够理解.过滤掉所有(非常聪明)"为了理解递归,你必须首先理解递归." 各种在线线程的回复我仍然没有得到它.

理解当面对不知道我们不知道的事情时,我们可能倾向于提出错误的问题或者错误地提出正确的问题我会分享我"想"我的问题,希望有类似观点的人可以分享一些一点点知识,有助于我打开递归灯泡!

这是函数(语法用Swift编写):

func sumInts(a: Int, b: Int) -> Int {
    if (a > b) {
        return 0
    } else {
        return a + sumInts(a: a + 1, b: b)
    }
}
Run Code Online (Sandbox Code Playgroud)

我们将使用2和5作为我们的论点:

println(sumInts(a: 2, b: 5))
Run Code Online (Sandbox Code Playgroud)

显然答案是14.但我不清楚这个价值是如何实现的.

这些是我的两个挂断:

  1. 递归调用该函数直到满足条件.那个条件是a> b.满足此条件时,返回0.乍一看,我希望返回值为0,这显然是不正确的.

  2. 在每次迭代中打印出'a'的值会产生一个我期望的值:2,3,4,5(此时5 + 1> b满足第一个条件:a> b)但我仍然不喜欢看看如何实现14的价值.

我的第一个想法是,类似于以下内容的东西神奇地发生:

var answer = a;
answer += a+1 until a > b;
return answer;   
Run Code Online (Sandbox Code Playgroud)

所以排除了魔法,我只是没有得到什么.我很想知道发生的事情不仅仅是隐含的.

如果有人能够解释在这种功能中技术上发生了什么以及为什么结果不是0以及最终如何a + sumInts(a: a + 1, b: b) = 14,我将永远负债累累.

language-agnostic recursion function

113
推荐指数
11
解决办法
3万
查看次数

javascript:递归匿名函数?

假设我有一个基本的递归函数:

function recur(data) {
    data = data+1;
    var nothing = function() {
        recur(data);
    }
    nothing();
}
Run Code Online (Sandbox Code Playgroud)

如果我有匿名功能,我怎么能这样做...

(function(data){
    data = data+1;
    var nothing = function() {
        //Something here that calls the function?
    }
    nothing();
})();
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来调用调用这个函数的函数...我已经看到某个地方的脚本(我记不清哪里)可以告诉你一个被调用的函数的名字,但我记不起任何一个那个信息现在.

javascript recursion scope anonymous-function

112
推荐指数
7
解决办法
6万
查看次数

GDB损坏了堆栈帧 - 如何调试?

我有以下堆栈跟踪.是否可以从中进行任何有用的调试?

Program received signal SIGSEGV, Segmentation fault.
0x00000002 in ?? ()
(gdb) bt
#0  0x00000002 in ?? ()
#1  0x00000001 in ?? ()
#2  0xbffff284 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb) 
Run Code Online (Sandbox Code Playgroud)

当我们得到一个时,从哪里开始查看代码Segmentation fault,并且堆栈跟踪不是那么有用?

注意:如果我发布代码,那么SO专家会给我答案.我想从SO那里得到指导并自己找到答案,所以我不会在这里发布代码.道歉.

c recursion gdb

111
推荐指数
4
解决办法
8万
查看次数

如果给出一些美元价值,如何找到所有硬币组合

几个月前,我找到了一段代码,我正在编写面试.

根据我的评论,它试图解决这个问题:

给定一美分的美分价值(例如200 = 2美元,1000 = 10美元),找到构成美元价值的所有硬币组合.只有便士(1¢),镍(5¢),角钱(10¢)和四分之一(25¢).

例如,如果给出100,答案应该是:

4 quarter(s) 0 dime(s) 0 nickel(s) 0 pennies  
3 quarter(s) 1 dime(s) 0 nickel(s) 15 pennies  
etc.
Run Code Online (Sandbox Code Playgroud)

我相信这可以通过迭代和递归方式解决.我的递归解决方案非常错误,我想知道其他人如何解决这个问题.这个问题的难点在于尽可能提高效率.

puzzle algorithm recursion coin-change

109
推荐指数
11
解决办法
19万
查看次数

defaultdict的嵌套defaultdict

有没有办法使defaultdict也成为defaultdict的默认值?(即无限级递归defaultdict?)

我希望能够做到:

x = defaultdict(...stuff...)
x[0][1][0]
{}
Run Code Online (Sandbox Code Playgroud)

所以,我可以这样做x = defaultdict(defaultdict),但那只是第二级:

x[0]
{}
x[0][0]
KeyError: 0
Run Code Online (Sandbox Code Playgroud)

有些食谱可以做到这一点.但是它可以简单地使用普通的defaultdict参数吗?

注意这是在询问如何进行无限级别的递归defaultdict,所以它与Python不同:defaultdict的defaultdict?,这是如何做一个两级默认.

我可能最终会使用模式,但当我意识到我不知道如何做到这一点时,它让我感兴趣.

python recursion defaultdict

109
推荐指数
5
解决办法
3万
查看次数

Python:使用递归算法作为生成器

最近我写了一个函数来生成具有非平凡约束的某些序列.这个问题伴随着一种自然的递归解决方案.现在碰巧,即使对于相对较小的输入,序列也是几千个,因此我宁愿使用我的算法作为生成器而不是使用它来填充具有所有序列的列表.

这是一个例子.假设我们想用递归函数计算字符串的所有排列.以下天真算法需要额外的参数'storage',并在找到时添加一个置换:

def getPermutations(string, storage, prefix=""):
   if len(string) == 1:
      storage.append(prefix + string)   # <-----
   else:
      for i in range(len(string)):
         getPermutations(string[:i]+string[i+1:], storage, prefix+string[i])

storage = []
getPermutations("abcd", storage)
for permutation in storage: print permutation
Run Code Online (Sandbox Code Playgroud)

(请不要关心效率低下,这只是一个例子.)

现在我想将我的函数转换为生成器,即生成排列而不是将其附加到存储列表:

def getPermutations(string, prefix=""):
   if len(string) == 1:
      yield prefix + string             # <-----
   else:
      for i in range(len(string)):
         getPermutations(string[:i]+string[i+1:], prefix+string[i])

for permutation in getPermutations("abcd"):
   print permutation
Run Code Online (Sandbox Code Playgroud)

此代码不能正常工作(该函数的行为像一个空发生器).

我错过了什么吗?有没有办法将上述递归算法转换为生成器而不用迭代算法替换它

python recursion generator

99
推荐指数
3
解决办法
3万
查看次数

以递归方式反转Java中的链表

我一直在为一个类的Java项目工作.它是链表的实现(此处称为AddressList包含调用的简单节点ListNode).问题在于,所有事情都必须通过递归算法来完成.我能做的一切都很好,没有一种方法:public AddressList reverse()

ListNode:

public class ListNode{
  public String data;
  public ListNode next;
}
Run Code Online (Sandbox Code Playgroud)

现在我的reverse函数只调用一个辅助函数,该函数接受一个允许递归的参数.

public AddressList reverse(){
  return new AddressList(this.reverse(this.head));
}
Run Code Online (Sandbox Code Playgroud)

我的助手功能有签名private ListNode reverse(ListNode current).

目前,我使用堆栈迭代地工作,但这不是规范要求的.我在C中找到了一个递归反转的算法,并手工将其转换为Java代码,但是它有效,但我对此并不了解.

编辑:没关系,我在此期间弄清楚了.

private AddressList reverse(ListNode current, AddressList reversedList){
  if(current == null) 
      return reversedList;
  reversedList.addToFront(current.getData());
  return this.reverse(current.getNext(), reversedList);
}
Run Code Online (Sandbox Code Playgroud)

虽然我在这里,有没有人看到这条路线有任何问题?

java recursion linked-list data-structures

97
推荐指数
8
解决办法
18万
查看次数

如何在MATLAB中获取特定目录下的所有文件?

我需要获取所有这些文件D:\dic并循环它们以进一步单独处理.

MATLAB是否支持这种操作?

它可以在其他脚本中完成,如PHP,Python ......

directory recursion file-io matlab file

97
推荐指数
5
解决办法
16万
查看次数