我正在阅读尾递归,如下所示
尾递归是指最后一行的递归调用.通过将主体包含在while循环中并用每个函数参数的一个赋值替换递归调用,可以机械地消除尾递归.
例如
void print(Iterator start, Iterator end, ostream& out=cout) {
if(start == end)
return;
out << *start++ << endl;
print(start, end, out);
}
Run Code Online (Sandbox Code Playgroud)
通过上述规范转换为迭代
void print(Iterator start, Iterator end, ostream& out=cout) {
while(true) {
if(start == end)
return;
out << *start++ << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的段落中提到"用每个函数参数用一个赋值替换递归调用,但在给定的例子中我们没有任何赋值?
任何人都可以解释并提供有关如何将递归转换为迭代函数的上述解释示例吗?
以下文本是算法书的摘录.
我们可以使用常用于链表的矩形框来绘制二叉树,但树通常被绘制为由线连接的圆,因为它们实际上是图形.我们在引用树时也没有显式地绘制NULL链接,因为每个具有N个节点的二叉树都需要N + 1个NULL链接.
我的问题是作者的意思是每个具有N个节点的二叉树都需要N + 1个空链接?作者如何使用N + 1号码?
我在算法书中有下面的合并排序程序,提到主要问题是合并两个排序列表需要线性额外内存,并且在整个算法中复制到临时数组并返回的额外工作具有减慢的效果大大降低了那种.通过在递归的交替级别明智地切换"a"和"tmp_array"的角色,可以避免这种复制.
我的问题是作者的意思是"通过在递归的交替级别明智地切换a和tmp_array的角色可以避免复制"以及如何在下面的代码中实现?请求展示我们如何实现这一目标的示例?
void mergesort( input_type a[], unsigned int n ) {
input_type *tmp_array;
tmp_array = (input_type *) malloc( (n+1) * sizeof (input_type) );
m_sort( a, tmp_array, 1, n );
free( tmp_array );
}
void m_sort( input_type a[], input_type tmp_array[ ], int left, int right ) {
int center;
if( left < right ) {
center = (left + right) / 2;
m_sort( a, tmp_array, left, center );
m_sort( a, tmp_array, center+1, right );
merge( a, tmp_array, left, center+1, right ); …Run Code Online (Sandbox Code Playgroud) 我读约DFS在算法导论由Cormen.以下是文字摘要.
与其前身子图形成树的BFS不同,由DFS产生的前身subgrpah可以由若干树组成,因为可以从多个源重复搜索.
除上述说明外,还提到了以下内容.
BFS仅限于一个来源似乎是任意的,因为DFS可以从多个来源搜索.虽然从概念上讲,BFS可以从多个来源进行,而DFS可以限制为一个来源,但我们的方法反映了这些搜索的结果通常如何使用.
我的问题是
我有如下功能声明
void func1(const void& * pThis) {
MyClass* pMyClass = static_cast<MyClass*>(pThis); //....I use PMyClass pointer.
}
Run Code Online (Sandbox Code Playgroud)
我收到错误无法转换const void*为MyClass*
怎么做这一步?
在Vxworks中,我们有各种时钟,如系统时钟和辅助时钟,并具有各种API,如下所示
我的问题是系统时钟和辅助时钟之间有什么区别.当程序员应该使用什么和在什么情况下?
我正在阅读 Robert Sedgewick 的关于算法的书。
public static void sort(Comparable[] a)
{ // Sort a[] into increasing order.
int N = a.length;
for (int i = 1; i < N; i++)
{ // Insert a[i] among a[i-1], a[i-2], a[i-3]... ..
for (int j = i; j > 0 && less(a[j], a[j-1]); j--)
exch(a, j, j-1);
}
}
Run Code Online (Sandbox Code Playgroud)
以上是java中的插入排序实现。这里作者提到如下改进。
通过缩短其内部循环将较大的条目移动到正确的位置而不是进行完全交换(从而将数组访问次数减少一半),大幅加快插入排序并不难
我很难理解上述改进。作者是什么意思
请求以简单的例子举例,以便更好地理解。
我正在阅读Robert Sedgwick的C++中的算法书.有人提到链表可以用数组表示.任何人都可以使用数组显示链接列表的简单实现吗?
是否可以使用链表的数组实现来实现Josephous问题?如果可能,示例实现将有所帮助.
谢谢!
class Rational {
const Rational operator*(const Rational& rhs) const
...
};
Rational oneHalf(1,2);
Rational result = oneHalf * 2; // fine (with non-explicit ctor)
result = 2 * oneHalf; // error! (even with non-explicit ctor)
Run Code Online (Sandbox Code Playgroud)
scott meyers在Effective C++的书中提到了如下
即使Rationl的构造函数不明确,一个编译,一个不编译.原因如下:
事实证明,只有当参数列在参数列表中时,参数才有资格进行隐式转换.
与调用成员函数的对象相对应的隐式参数 - "this"指向的对象 - 永远不能进行隐式转换.这是第一次调用编译而第二次调用没有.
我的问题是作者在上述声明中的意思是"只有它们列在参数列表中"?什么是参数列表?
我正在阅读S.DasGupta的算法书.以下是有关第n个Fibonacci数所需位数的文本的文本片段.
如果添加小数字,将加法视为单个计算机步骤是合理的,32位数字表示.但是第n个Fibonacci数约为0.694n位,随着n的增长,这可能远远超过32.对任意大数的算术运算不可能在单个恒定时间步骤中执行.
我的问题是例如,对于Fibonacci数F1 = 1,F2 = 1,F3 = 2,依此类推.然后用上面的公式中的"n"代替,即F1的0.694n约为1,F2约为2位,但对于F3等,上述公式失败.我想我并不理解作者在这里的意思,任何人都可以帮助我理解这一点吗?
谢谢