递归和栈溢出。

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

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

所以一般栈类型放入参数,模拟递归调用。

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

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

2)用局部变量的栈类型。也不超过90000个数字。

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

不明白为什么要new。

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

stack<int*> recursion_stack;

这2个数据不都是放在堆中吗?。。。

#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();
}
}
}

时间: 2024-10-29 19:12:28

递归和栈溢出。的相关文章

Qt学习之系列[9] – QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃

api含义:QCoreApplication::processEvents() 将处理所有事件队列中的事件并返回给调用者. 问题描述: 当主线程在某个槽函数里正在执行processEvents时, 刚好有一个能响应此槽函数的信号发送过来了(肯定是其他线程发的信号),  这时就可能会发生可怕的递归, 导致栈溢出崩溃. 原因是processEvents,进入到无尽的递归中. 示例代码: bugThread.h #include <QThread> class BugThread : public

栈溢出 缓冲区溢出的一种 缓冲区以外的存储单元被改写 优化方法之一:尾调用

个人:尾调用时函数式编程的一个重要概念, 栈溢出: 函数调用会在内存形成一个"调用记录",又称"调用帧"(call frame),保存调用位置和内部变量等信息.如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧.等到B运行结束,将结果返回到A,B的调用帧才会消失.如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推.所有的调用帧,就形成一个"调用栈"(call stack).递归调用非常耗内存. 尾调用: 就是指某

函数-递归调用

一.什么是递归调用 递归调用:在函数调用过程中,直接或间接地调用了函数本身,这就是函数的递归调用1.递归的优点 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈溢出.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出.可以试试fact(1000): 2.递归的缺点 解

【Python实践-3】汉诺塔问题递归求解

1 # -*- coding: utf-8 -*- 2 #汉诺塔移动问题 3 # 定义move(n,a,b,c)函数,接受参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量 4 # 然后打印出把所有盘子从A借助B移动到C的方法 5 def move(n,a,b,c): 6 if n==1: 7 print('move', a, '-->', c) 8 else: 9 move(n-1,a,c,b) 10 move(1,a,b,c) 11 move(n-1,b,a,c) 12 move(5,'

八皇后,回溯与递归(Python实现)

八皇后,回溯与递归(Python实现) 八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语言的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩展为九皇后,十皇后问题. 问题:在一个8*8棋盘上,每一行放置一个皇后旗子,且它们不冲突.冲突定义:同一列不能有两个皇后,每一个对角线也不能有两个皇后.当然,三个皇后也是不行的,四个也是不行的,凭你的智商应该可以理解吧. 解决方案:回溯与递归. 介绍: 1.回溯法 回溯

python基础之函数

python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 函数式编程和面向过程编程的区别: 函数式:将某功能代码封装到函数中,日后便无需重复编

Day10:内置函数、匿名函数、递归函数

一.内置函数 1.数学运算类 2.集合类操作 内置函数个别使用示例 1.any 集合中的元素有一个为真的时候为真, 特别的,若为空串返回为False 1 print(any([0,''])) 2 print(any([0,'',1])) 执行结果 1 False 2 True 2.divmod 取商得余数,用于做分页显示功能 1 print(divmod(10,3)) #取商得余数,用于做分页显示 执行结果 1 (3, 1) 3.eval  把字符串中的数据结构给提取出来 1 dic={'nam

ACM—Number Sequence(HDOJ1005)

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 主要内容: A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). 看到这样的公式很容易想到递归调用求解,但是在本题中n的取

python3.5修炼手册12

函数 函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码. 定义函数 python支持自定义函数,即由我们自己定义一个实现某个功能的函数. 自定义函数规则: ①函数代码块以def关键字开头,后接函数标识符名称和圆括号"()". ②所有传入的参数和自定义变量都必须放在圆括号中,可以在圆括号中定义参数. ③函数的第一行语句可以选择性的使用文档字符串,用于存放函数说明. ④函数内容以冒号开始,并且要缩进. ⑤return[表达式]结束函数,选择性的返回一个值给调用方.不带表达式的r