我读到C++标准禁止递归main(),但是g ++编译以下代码而没有抱怨:
int main()
{
main();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以澄清这个吗?
我是一个C++新手,但我无法在网上找到这个(最有可能是微不足道的)问题的答案.我在编译两个类相互包含的代码时遇到了一些麻烦.首先,我的#include语句应该在我的宏内部还是外部?实际上,这似乎并不重要.但是,在这种特殊情况下,我遇到了麻烦.将#include语句放在宏之外会导致编译器递归并给我"#include嵌套太深"的错误.这似乎对我有意义,因为在调用#include之前,这两个类都没有完全定义.然而,奇怪的是,当我尝试将它们放入其中时,我无法声明其中一个类的类型,因为它无法识别.从本质上讲,这是我正在尝试编译的内容:
啊
#ifndef A_H_
#define A_H_
#include "B.h"
class A
{
private:
B b;
public:
A() : b(*this) {}
};
#endif /*A_H_*/
Run Code Online (Sandbox Code Playgroud)
BH
#ifndef B_H_
#define B_H_
#include "A.h"
class B
{
private:
A& a;
public:
B(A& a) : a(a) {}
};
#endif /*B_H_*/
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "A.h"
int main()
{
A a;
}
Run Code Online (Sandbox Code Playgroud)
如果它有所作为,我使用的是g ++ 4.3.2.
一般来说,#include语句应该去哪里?我一直看到它们超出了宏,但我清楚描述的场景似乎打破了这个原则.感谢任何帮助提前!如果我犯了任何愚蠢的错误,请允许我澄清我的意图!
嗨,我有一个引用自己的表,我需要能够从给定的父ID中选择父级及其所有子记录.
我的表格如下:
ID | ParentID | Name
-----------------------
1 NULL A
2 1 B-1
3 1 B-2
4 2 C-1
5 2 C-2
Run Code Online (Sandbox Code Playgroud)
因此,对于上面的示例,我希望能够传入值1并获取上面的所有记录.
到目前为止,我已经提出了以下递归表值函数,但它没有按预期运行(只返回第一条记录).
CREATE FUNCTION [dbo].[SelectBranches]
(
@id INT
,@parentId INT
)
RETURNS @branchTable TABLE
(
ID INT
,ParentID INT
,Name INT
)
AS
BEGIN
IF @branchId IS NOT NULL BEGIN
INSERT INTO @branchTable
SELECT
ID
,ParentID
,Name
FROM
tblLinkAdvertiserCity
WHERE
ID = @id
END
INSERT INTO @branchTable
SELECT
br.ID
,br.ParentID
,br.Name
FROM
@branchTable b
CROSS APPLY
dbo.SelectBranches(NULL, …Run Code Online (Sandbox Code Playgroud) 如果没有,是否有一个好的计数器示例显示迭代算法,其中不存在递归对应物?
如果所有迭代算法都可以递归表达,那么在哪些情况下更难以做到这一点?
此外,编程语言在这一切中扮演什么角色?我可以想象,Scheme程序员对Java迭代(=尾递归)和堆栈使用的看法与Java专用程序员不同.
在Haskell中,与许多其他函数语言一样,函数foldl被定义为例如foldl (-) 0 [1,2,3,4] = -10.
这没关系,因为foldl (-) 0 [1, 2,3,4]根据定义,((((0 - 1) - 2) - 3) - 4).
但是,在Racket中,(foldl - 0 '(1 2 3 4))是2,因为Racket"智能地"计算如下:(4 - (3 - (2 - (1 - 0)))),确实是2.
当然,如果我们定义辅助功能翻转,像这样:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
Run Code Online (Sandbox Code Playgroud)
然后我们可以在Racket中实现与Haskell相同的行为:而不是(foldl - 0 '(1 2 3 4))我们可以写:(foldl (flip -) 0 '(1 2 3 4))
问题是:为什么foldl球拍以这种奇怪的(非标准的,非直观的)方式定义,与其他语言不同?
我有一个方法将遍历文件夹及其所有子文件夹并获取文件路径列表.但是,我只能弄清楚如何创建它并将文件添加到公共列表,而不是如何返回列表.这是方法:
public List<String> files = new List<String>();
private void DirSearch(string sDir)
{
try
{
foreach (string f in Directory.GetFiles(sDir))
{
files.Add(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
DirSearch(d);
}
}
catch (System.Exception excpt)
{
MessageBox.Show(excpt.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我只是DirSearch()在我的代码中调用某个点并用路径"填充"列表,但我希望能够多次使用它来创建具有不同目录的不同列表等.
我刚刚在愚蠢/ ManualExecutor.h中看到了这个黑魔法
TimePoint now_ = now_.min();
Run Code Online (Sandbox Code Playgroud)
在我对整个库源代码进行grep之后,我还没有看到now_除此处之外的其他任何变量的定义.这里发生了什么事?这实际上是某种递归变量声明吗?
我想收到以下输出.
假设文件系统上的目录结构如下:
-dir1
-dir2
-file1
-file2
-dir3
-file3
-file4
-dir4
-file5
-dir5
-dir6
-dir7
脚本的输出必须如下:
目录:
/dir1 /dir1/dir2 /dir1/dir2/dir3 /dir1/dir2/dir4 /dir1/dir5 /dir1/dir5/dir6 /dir1/dir5/dir7
文件:
/dir1 /dir1/dir2/file1 /dir1/dir2/file2 /dir1/dir2/dir3/file3 /dir1/dir2/dir3/file4 /dir1/dir2/dir4/file5 /dir1/dir5/dir6 /dir1/dir5/dir7
你能告诉我如何保持的输出find . -type d,并find . -type f到另一个文件?
是否有任何通用的启发式,提示,技巧或常用设计范例可用于将递归算法转换为迭代算法?我知道可以做到,我想知道在这样做的时候是否有值得牢记的做法.
可能重复:
动态编程和记忆:自上而下与自下而上的方法
我已经阅读了很多文章,但似乎无法理解它.有时递归和动态编程看起来相同,而在其他时候,memoization和动态编程看起来很相似.有人可以向我解释有什么区别吗?
PS如果您可以使用针对同一问题的三种方法向我指出一些代码,那么它也会很有帮助.(例如Fibonacci系列问题,我认为我读过的每篇文章都使用了递归,但将其称为动态编程)