zoukankan      html  css  js  c++  java
  • 递归和栈溢出。

    递归确实是很多算法的基础思想。但外部因素导致递归会栈溢出。

    但却是不甘心如此简练的有效的算法,放弃不用。

    所以一般有2中方式来使用大数据的递归思路

    1)用栈类型放入参数,模拟递归调用。

    2)把大数据分割为一批适中的数据,就可以直接使用递归函数。

    用快速排序,测试并总结了下。

    1)本例大概 排序30000个数字,递归就溢出。

    2)用局部变量的栈类型。也不超过90000个数字。 不知道为什么,看来要看下stack的实现。

    3)栈类型用指针,放入堆中。到此问题解决。

    #include <iostream>
    #include <stack>

    using namespace std;

    void quickS(int* left,int* right);
    void quickS2(int* left,int* right);
    int main()
    {

    int intArray[90000]={3,2,1,4,4,5,6,8,2,4};
    for(int i=90000-1;i!=-1;--i)
    {
    intArray[i]=i;
    }

    quickS2(intArray,intArray+90000-1);

    // for(int i=0;i!=9;++i)
    // {
    // cout<<intArray[i]<<endl;
    // }

    return 0;
    }


    //递归
    void quickS(int* left,int* right)
    {

    if(left<right)
    {
    int* compareP=left;
    for(int * p=left+1;p<=right;++p)
    {
    if(*p<*compareP)
    {
    int temp=*p;
    for(int * movep=p;movep>compareP;--movep)
    {
    *movep=*(movep-1);
    }

    *compareP=temp;
    ++compareP;
    }
    }
    quickS(left,compareP-1);
    quickS(compareP+1,right);
    }
    else
    {
    //临界点.求解完毕.
    }
    }


    //
    //注意2点.
    //递归总体就2个情况.递归调用和到达临界点.一般是if else.
    //所以2中情况的结尾.都相当于函数执行了一次.那么.
    //1)临界点,需要pop.相当于一次函数返回.
    //2)非临界点, 在调用递归前.也必须pop一次.本来是放在调用后面,也就是函数结束.但是这里不是递归,语句不会执行完递归,返回这里.
    //所以必须在在模拟递归前先模拟函数返回.
    void quickS2(int* left,int* right)
    {

    stack<int*>* recursion_stack=new stack<int*>();


    //初始参数入栈
    recursion_stack->push(right);
    recursion_stack->push(left);

    bool start=true;

    while(!recursion_stack->empty())
    {
    start=false;
    left=recursion_stack->top();
    recursion_stack->pop();
    right=recursion_stack->top();
    recursion_stack->push(left);


    if(left<right)
    {
    int* compareP=left;
    for(int * p=left+1;p<=right;++p)
    {
    if(*p<*compareP)
    {
    int temp=*p;
    for(int * movep=p;movep>compareP;--movep)
    {
    *movep=*(movep-1);
    }

    *compareP=temp;
    ++compareP;
    }
    }

    //原一次递归调用完毕,函数返回时,会返回到上一层函数,这里必须在模拟递归前先模拟函数返回.
    recursion_stack->pop();
    recursion_stack->pop();

    //模拟递归
    recursion_stack->push(compareP-1);
    recursion_stack->push(left);
    //模拟递归
    recursion_stack->push(right);
    recursion_stack->push(compareP+1);

    }
    else
    {
    //模拟函数返回
    recursion_stack->pop();
    recursion_stack->pop();
    }
    }
    }

  • 相关阅读:
    创建供应商-采购模块
    定义容差组
    前台创建供应商-财务角度
    对供应商账户组分配编号范围
    拓端数据tecdat|R语言建立和可视化混合效应模型mixed effect model
    拓端数据tecdat|R语言建模收入不平等:分布函数拟合及洛伦兹曲线(Lorenz curve)
    拓端数据tecdat|R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
    拓端数据tecdat|R语言ARIMA,SARIMA预测道路交通流量时间序列:季节性、周期性
    拓端数据tecdat|ARIMA模型预测CO2浓度时间序列
    拓端数据tecdat|R语言基于递归神经网络RNN的温度时间序列预测
  • 原文地址:https://www.cnblogs.com/lsfv/p/5955034.html
Copyright © 2011-2022 走看看