迭代比递归更高效,对吧?那么为什么有些人认为递归比迭代更好(用他们的话来说更优雅)?我真的不明白为什么像Haskell这样的语言不允许迭代并鼓励递归?鼓励表现不佳的东西是不是很荒谬(当更高性能的选项即递归可用时也是如此)?请详细说明一下.谢谢.
有没有办法混合递归和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)
我只是想知道这是否可以递归完成.
我在这里做了一个测试,但输出是一个没有结束的循环,我不知道为什么.
实际上,我正在做另一个测试,但是当我写这个时,我不明白循环是如何发生的.它反复输出"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++中向我展示一个简单的尾递归函数吗?
为什么尾部递归更好,如果它甚至是?
除了尾递归之外还有哪些其他类型的递归?
我想添加所有文件,无论是什么:是删除,创建,修改,未跟踪等?我只是不想与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) 我天真地尝试创建一个递归生成器.没工作.这就是我做的:
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在递归方案中将命令转移到上面的级别?
当我来到一个描述函数递归的章节时,我是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行,函数调用自己.这里发生了什么事?
该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
我会发出什么命令或命令?
重要的是,这不会阻塞其中包含空格的文件名.
我刚刚开始通过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正在逃避我.任何和所有帮助非常感谢.
我有以下代码通过目录递归搜索文件,该目录返回所有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)
不太适用于递归.任何指针都将非常感激.