标签: recursion

为什么递归优先于迭代?

迭代比递归更高效,对吧?那么为什么有些人认为递归比迭代更好(用他们的话来说更优雅)?我真的不明白为什么像Haskell这样的语言不允许迭代并鼓励递归?鼓励表现不佳的东西是不是很荒谬(当更高性能的选项即递归可用时也是如此)?请详细说明一下.谢谢.

language-agnostic iteration recursion performance

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

使用yield进行递归

有没有办法混合递归和yield声明?例如,无限数字生成器(使用递归)将类似于:

def infinity(start):
    yield start
    # recursion here ...

>>> it = infinity(1)
>>> next(it)
1
>>> next(it)
2
Run Code Online (Sandbox Code Playgroud)

我试过了:

def infinity(start):
    yield start
    infinity(start + 1)
Run Code Online (Sandbox Code Playgroud)

和

def infinity(start):
    yield start
    yield infinity(start + 1)
Run Code Online (Sandbox Code Playgroud)

但他们没有做我想要的东西,第一个停止后,它会产生start和第二个产生start,那么发生器,然后停了下来.

注意:请知道您可以使用while循环执行此操作:

def infinity(start):
    while True:
        yield start
        start += 1
Run Code Online (Sandbox Code Playgroud)

我只是想知道这是否可以递归完成.

python recursion yield python-2.7

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

构造函数中的无限循环,不带或不带

我在这里做了一个测试,但输出是一个没有结束的循环,我不知道为什么.

实际上,我正在做另一个测试,但是当我写这个时,我不明白循环是如何发生的.它反复输出"ABC".

#include <map>
#include <string>
#include <iostream>

class test
{
public:
   std::map <int, int> _b;
   test();
   test (std::map<int, int> & im);
   ~test();
   };

test::test()
{
  std::cout<<"abc";
  _b.clear();
  _b[1]=1;
  test(_b);
}

test::test(std::map <int, int>& im)
{
   std::cout<<im[1];
}

test::~test() {};

int main ()
{
   test a;  
}
Run Code Online (Sandbox Code Playgroud)

c++ recursion constructor const

61
推荐指数
1
解决办法
3905
查看次数

C++中的尾递归

有人可以在C++中向我展示一个简单的尾递归函数吗?

为什么尾部递归更好,如果它甚至是?

除了尾递归之外还有哪些其他类型的递归?

c++ recursion tail-recursion g++

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

git add -A没有在目录中添加所有修改过的文件

我想添加所有文件,无论是什么:是删除,创建,修改,未跟踪等?我只是不想与git添加所有我的文件EVERY TIME.我试过git add -A但它不是在文件夹中添加修改过的文件.

这是git status我项目的初始内容:

Rakib-MacBook-Pro:my-xcode-practice rakib$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   BankAccount (modified content, untracked content)
#   modified:   BuckysButtons (modified content, untracked content)
# …
Run Code Online (Sandbox Code Playgroud)

git recursion

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

生成器可以递归吗?

我天真地尝试创建一个递归生成器.没工作.这就是我做的:

def recursive_generator(lis):
    yield lis[0]
    recursive_generator(lis[1:])

for k in recursive_generator([6,3,9,1]):
    print(k)
Run Code Online (Sandbox Code Playgroud)

我得到的只是第一项6.

有没有办法使这样的代码工作?基本上yield在递归方案中将命令转移到上面的级别?

python recursion generator

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

斐波那契递归函数如何"起作用"?

当我来到一个描述函数递归的章节时,我是Javascript的新手并正在阅读它.它使用示例函数来查找第n个Fibonacci序列.代码如下:

function fibonacci(n) {
   if (n < 2){
     return 1;
   }else{
     return fibonacci(n-2) + fibonacci(n-1);
   }
}

console.log(fibonacci(7));
//Returns 21
Run Code Online (Sandbox Code Playgroud)

我无法准确掌握这个功能正在做什么.有人能解释一下这里发生了什么吗?我被困在第5行,函数调用自己.这里发生了什么事?

recursion fibonacci

59
推荐指数
4
解决办法
6万
查看次数

如何从Unix命令行递归地解压缩目录及其子目录中的存档?

该unzip命令没有递归解压缩存档的选项.

如果我有以下目录结构和存档:

/Mother/Loving.zip
/Scurvy/Sea Dogs.zip
/Scurvy/Cures/Limes.zip

我想将所有档案解压缩到与每个档案同名的目录中:

/Mother/Loving/1.txt
/Mother/Loving.zip
/Scurvy/Sea Dogs/2.txt
/Scurvy/Sea Dogs.zip
/Scurvy/Cures/Limes/3.txt
/Scurvy/Cures/Limes.zip

我会发出什么命令或命令?

重要的是,这不会阻塞其中包含空格的文件名.

unix recursion spaces unzip

58
推荐指数
5
解决办法
9万
查看次数

SICP练习1.6的解释是什么?

我刚刚开始通过SICP(我自己;这不适合一个班级),我已经在练习1.6中苦苦挣扎了几天,我似乎无法弄明白.这是Alyssa重新定义if的方式cond,如下所示:

(define (new-if predicate then-clause else-clause)
    (cond (predicate then-clause)
          (else else-clause))
Run Code Online (Sandbox Code Playgroud)

她在一些简单的情况下成功测试它,然后用它来重新编写平方根程序(它工作得很好if):

(define (sqrt-iter guess x)
    (new-if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x)
                       x)))
Run Code Online (Sandbox Code Playgroud)

然后问题是:"当Alyssa试图用它来计算平方根时会发生什么?解释." [如果有必要,我很高兴能重现其他程序(good-enough?,improve,等),只是让我知道.]

现在,我知道会发生什么:它永远不会返回一个值,这意味着程序无限地递归.我无法解释为什么会这样.无论之间存在什么微妙的差异,if并且new-if正在逃避我.任何和所有帮助非常感谢.

recursion sicp

58
推荐指数
5
解决办法
7946
查看次数

以递归方式搜索目录中的文件

我有以下代码通过目录递归搜索文件,该目录返回所有xml文件的列表给我.一切正常,但根目录中的xml文件不包含在列表中.

我理解为什么,因为它首先做的是获取根目录中的目录,然后获取文件,从而错过了根目录上的GetFiles()调用.我尝试在foreach之前包含GetFiles()调用,但结果并不像我预期的那样.

public static ArrayList DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d, "*.xml"))
            {
                string extension = Path.GetExtension(f);
                if (extension != null && (extension.Equals(".xml")))
                {
                fileList.Add(f);
                }
            }
            DirSearch(d);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    return fileList;
}
Run Code Online (Sandbox Code Playgroud)

我的目录结构类似于:

RootDirectory
        test1.0.xml
            test1.1.xml
            test1.2.xml
  2ndLevDir
            test2.0.xml
            test2.1.xml
  3rdLevDir
               test3.0.xml
               test3.1.xml
Run Code Online (Sandbox Code Playgroud)

代码返回:

test2.0.xml
test2.1.xml
test3.0.xml
test3.1.xml
Run Code Online (Sandbox Code Playgroud)

我想返回每个文件,包括:

test1.0.xml
test1.1.xml
test1.2.xml
Run Code Online (Sandbox Code Playgroud)

不太适用于递归.任何指针都将非常感激.

c# recursion

57
推荐指数
2
解决办法
13万
查看次数