首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fencepost问题:我需要一个递归函数,它在第一次调用某个节时跳过执行。

Fencepost问题:我需要一个递归函数,它在第一次调用某个节时跳过执行。
EN

Stack Overflow用户
提问于 2014-10-29 02:43:53
回答 1查看 215关注 0票数 0

我试图制作一个C++程序来创建一个格式化的CSS文件。

我首先要做的是获取HTML文件,并将其构建到具有以下类型节点的树中。

代码语言:javascript
复制
struct node
{
    std::string element_type;
    std::vector<std::string> class_list;
    std::string iden;
    std::vector<node*> children;
};

现在,我正在尝试创建一个函数,该函数取树的根,并返回一个字符串,该字符串是文档的格式化CSS (它只关注CSS、class、es和id的属性)。

例如,如果HTML文件是

代码语言:javascript
复制
<html>
    <body>
         <div class="row">
             <h1 id="title">Here's my title</h1>    
         </div>
         <div class="row red">
             <p>Here's some text inside a div of class row and red</p>
         </div>
         <div class="row">
             <a href="google.com">Cool, you can click here to go to Google</a>
         </row>
    </body>
</html>

然后,在它变成一棵树之后,我有了一个功能。

代码语言:javascript
复制
std::string DocTree::_tree2Str(node * rt)

我打算让它返回字符串

代码语言:javascript
复制
html {}
  html > body {}
     html > body > div.row {}   
       html > body > div.row > h1#title {}
       html > body > div.row > a {} 
     html > body > div.row.red {}  
       html > body > div.row.red > p {}

下面是函数的实现:

代码语言:javascript
复制
std::string DocTree::_tree2Str(node * rt)
{
    std::string css("");
    if (rt)
    {
        css.append(rt->element_type);

        if (!rt->class_list.empty())
        {
            for (std::vector<std::string>::iterator it(rt->class_list.begin()), offend(rt->class_list.end()); it != offend; ++it)
            {
                css.append("." + *it);
            }
        }
        if (!rt->iden.empty())
        {
            css.append("#" + rt->iden);
        }
        if (!rt->children.empty())
        {
            for (std::vector<node*>::iterator it(rt->children.begin()), offend(rt->children.end()); it != offend; ++it)
            {
                css.append("\n\t" + _tree2Str(*it));
            }
        }
    }
    return css;
}

我跳过的唯一一件事是" > ",因为我不知道如何将它转换到递归函数中。每次函数被称为时,它都应该在函数的开头打印,除非是第一次

此外,可能还有其他逻辑谬误。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 03:01:37

您可以创建一个private _innerTree2Str(node * rt, bool printGt)方法,该方法包含_tree2Str方法的内容,以及顶部的行if(printGt) css.append(" > ");。所有对_tree2Str(node)的调用都变成了对_innerTree2Str(node, true)的调用

然后_tree2Str变成

代码语言:javascript
复制
std::string DocTree::_tree2Str(node * rt)
{
    return _innerTree2Str(rt, false);
}

这样,当您第一次调用_innerTree2Str时,printGt变量是false,并且您不会追加" > ",每隔一次printGt将为true

您可以将printGt参数直接添加到_tree2Str,而不是创建第二个方法,但是您将依赖调用方记住传入printGt参数的false

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26621967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档