У меня есть функция, которая рекурсивна, но вместо этого я хотел бы сделать ее нерекурсивной. Я просто не знаю, как это сделать.Сделать эту функцию нерекурсивной?
void AguiWidgetManager::recursiveRender(const AguiWidget *root)
{
//recursively calls itself to render widgets from back to front
AguiWidget* nonConstRoot = (AguiWidget*)root;
if(!nonConstRoot->isVisable())
{
return;
}
clip(nonConstRoot);
nonConstRoot->paint(AguiPaintEventArgs(true,graphicsContext));
for(std::vector<AguiWidget*>::const_iterator it =
root->getPrivateChildBeginIterator();
it != root->getPrivateChildEndIterator(); ++it)
{
recursiveRender(*it);
}
for(std::vector<AguiWidget*>::const_iterator it =
root->getChildBeginIterator();
it != root->getChildEndIterator(); ++it)
{
recursiveRender(*it);
}
}
Его хорошо, если решение не будет работать с итераторами.
Благодаря
Знаете, если вы сделаете эту функцию нерекурсивной, она будет очень плохо названа. –
Могу я спросить, почему? Я думаю, что рекурсия, вероятно, самый простой способ сделать это. Итеративное решение, вероятно, будет использовать стек и вручную реализовать рекурсию. Кроме того, 'std :: for_each (root-> getChildBeginIterator(), root-> getChildEndIterator(), recursiveRender);' выглядит немного лучше, чем у вас. –
@Chris Lutz 'for_each' может выглядеть лучше, но если я не ошибаюсь, так как функция является функцией-членом, вам нужно связывание' mem_fun_ref' или что-то подобное, чтобы заставить его правильно позвонить. –