我一直对递归问题感到困惑。
我想将给定的数字(例如20)分成两部分,包括1到一半,一半结束,现在这两个子数组应该以相同的方式划分,即1到一半,一半结束,直到我们遍历全部元件。
请建议我如何递归或通过迭代实现这一目标。
<小时/> 将评论转移到问题。
假设输入为1和20.输出类似于:
此迭代将以相同的方式运行,直到我们遍历1到20之间的所有数字。
答案 0 :(得分:0)
我需要的是......(1)在第一次迭代中我想要10.(2)在 第二次迭代我希望5,15。(3)在我想要的第三次迭代中 3,8,13,18。等等。 - user4365176
我找到了一个工具(在我的库中),我用它将一个向量(非递减整数)的内容传递给一个二叉树SUCH - 简单的二叉树将(大部分)平衡。
以下是我为您的目的简化的代码版本。这个片段是一个类中的方法,所以未定义的变量以&#39; m _&#39;为前缀。 (m_tree,m_ss,m_R)是该类的数据属性。 m_tree是我的本土简单二叉树的实例,方法&#34; insertVal(size_t i)&#34;,m_ss是指向std :: stringstream的指针,m_R是用户输入数字,范围
&#39; genSeqRR()&#39;是递归的。它将一个范围切成两半,然后处理右边然后处理左边(有点是深度先排序的形式。目前,序列可能略有偏差。不确定如何描述。参见注2(代码中)
我还将这些序列插入AVL树(来自rosettacode.org/wiki),结果令人失望。可能没错,但在这里没用。
您可以尝试使用RedBlack树插入序列。
代码后的示例输出:
// Generate a Sequence of size_t values over a fixed limited Range,
// Recursively using binary-pattern through the range, to achieve approximate
// balance when inserting into a simple binary tree.
//
// Note1: 'index' is range (0..N-1), value to insert is (indx+1) i.e 1..N
// Note2: prefer to insert bigger indx first
//
void genSeqRR(size_t depth, const size_t si, const size_t bi)
{
size_t rng = bi - si; // big indx - small indx
switch (rng)
{
default: // 3 or more elements, insert mi, and recurse
{
size_t delta = rng / 2;
size_t mi = si + delta; // mid index
(void)m_tree->insertVal(mi+1); // Note1
// if(m_ss)
*m_ss << " rng:" << std::setw(3) << rng
<< " dpth:" << std::setw(3) << depth // depth of genSeqRR
<< " iVal:" << std::setw(3) << mi+1
<< std::endl;
// Note2
genSeqRR (depth+1, mi+1, bi); // recurse on max - (middle + 1) thru biggest index
genSeqRR (depth+1, si, mi-1); // recurse on min - smallest index thru (middle - 1)
}
break;
case 0: // 1 elment
{
(void)m_tree->insertVal (si+1); // Note1
// if(m_ss)
*m_ss << " rng:__1"
<< " dpth:" << std::setw(3) << depth
<< " iVal:" << std::setw(3) << si+1 << std::endl;
}
break;
case 1: // 2 consecutive elements
{
// Note1, Note2
(void)m_tree->insertVal(bi+1);
(void)m_tree->insertVal(si+1);
// if(m_ss)
*m_ss << " rng:__2"
<< " dpth:" << std::setw(3) << depth
<< " iVal:" << std::setw(3) << si+1 << std::setw(3) << bi+1 << std::endl;
}
break;
}// switch
} // void genSeqRR()
范围m_R = 20,
genSeqRR (1, 0, (m_R-1)); // start recursion over whole range
输出:
Anchor->showTallView()
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
范围m_R = 19,
genSeqRR (1, 0, (m_R-1)); // start recursion over whole range
输出:
Anchor->showTallView()
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
范围m_R = 19,
Anchor->showTallView()
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'