• 递归改非递归练习加总结


    今天写了10个数字排列成环,相邻数字之和为素数的搜索题目,并由此总结递归改写非递归的模式

    经过两个题目的比较后发现,不应该提出过于细节的模型,模式化到吧递归的搜索树的形式掌握,记住模拟堆栈中记录的是搜索进行状态,终止深度是搜索树的深度,以此两点,结合题目具体条件节能完成要求

    带有回溯部分的题目,回溯是在循环开始时先判断搜索横向状态是否还有未进行的,如果没有的话就倒退一步,切记把数据所有标记还原初始状态,有事不止一个数据

    递归代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const bool simp[]= {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0};
    bool use[11];
    int s[11];
    int len=0,step;
    void search(int step)
    {
        if(step==11)
        {
            if(simp[s[1]+s[10]])
            {
                for(int i=1;i!=11;i++)
                    printf("%d ",s[i]);
                printf("\n");
            }
        }else
        {
            for(int i=2;i!=11;i++)
            if(!use[i]&&simp[s[step-1]+i])
            {
                use[i]=1;
                s[step]=i;
                search(step+1);
                use[i]=0;
            }
        }
    }
    int main()
    {
        freopen("output.txt","w",stdout);
        memset(use,0,sizeof(use));
        use[1]=1;
        s[1]=1;
        search(2);
        return 0;
    }

    非递归代码:

    #include<cstdio>
    #include<cstring>
    #include<stack>
    using namespace std;
    const bool simp[]= {0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0};
    bool use[11];
    int s[11];
    int dep,step;
    int main()
    {
        memset(use,0,sizeof(use));
        for(int i=2;i<=10;i++)
            s[i]=1;
        use[1]=1;
        s[1]=1;
        dep=2;
        step=1;
        while(dep!=1)
        {
            step++;
            if(step>10)
            {
                use[s[dep]]=0;
                s[dep]=1;
                dep--;
                if(dep>1)
                step=s[dep];
            }else
            for(int i=step; i<=10; i++)
            {
                if(!use[i]&&simp[s[dep-1]+i]&&dep<=10)
                {
                    if(dep==10)
                    {
                        if(simp[s[1]+i])
                        {use[i]=1;
                        s[dep]=i;
                            for(int j=1; j<=10; j++)
                                printf("%d ",s[j]);
                            printf("\n");
                        }
                    }else
                    {
                        if(s[dep]!=1)
                        use[s[dep]]=0;
                        use[i]=1;
                        s[dep]=i;
                        dep++;
                        step=s[dep];
                    }
                    break;
                }
                step=i;
            }
     
        }
        return 0;
    }
  • 相关阅读:
    SpringMVC
    Spring mvc 下Ajax获取JSON对象问题 406错误
    Docker国内镜像源
    获取redis cluster主从关系
    终端登录超时限制暂时解除
    vim全选,全部复制,全部删除
    [转]Redis集群搭建
    Jenkins持续集成01—Jenkins服务搭建和部署
    ELK重难点总结和整体优化配置
    ELK 经典用法—企业自定义日志收集切割和mysql模块
  • 原文地址:https://www.cnblogs.com/nbalive2001/p/2596715.html
Copyright © 2020-2023  润新知