| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 894 人关注过本帖
标题:郁闷!递归问题
只看楼主 加入收藏
chllcy
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-7
收藏
 问题点数:0 回复次数:3 
郁闷!递归问题

#include "stdafx.h"
#include "iostream"
#include"stdio.h"
using namespace std;

#define MAXSIZE 20
typedef int listarr[MAXSIZE];
void listorder(listarr list, int left, int right)
{
int mid;
if (left<=right)
{ mid=(left+right)/2;
printf("%4d",list[mid]);
listorder(list,left,mid-1);
listorder(list,mid+1,right);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int listarr[MAXSIZE]={18,32,4,9,26,6,10,30,12,8,45};
int left=0,right=10;
listorder(listarr,left,right);
system("pause");
return 0;
}
就是这个程序,本人用单步调试还是搞不明白它这里进栈,出栈的时候,请高手给我指点一下这个程序,执行到哪句会进栈(进入的数值是多少),到哪句时出栈(出栈值是多少).高手给我指点一下详细的执行过程!谢谢了,小弟已经弄了2个晚上了,实在吃不消了!

搜索更多相关主题的帖子: 递归 
2006-10-21 00:36
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
这象是快速排序吧...可是.调试了一下.得不到正确结果.

这种双递归的题我的理解不是按进栈出栈理解的

就象叠罗塔一样.如果你细致的研究,画图,研究它的排列原理.你会发现越研究.越糊涂

可以这么说.递归有时候是一种很微妙的东西.要学会抓住技巧.

如果你细致的研究.你会发现递归的函数与平时对程序的理解很相似.

你再看看.如果发现不了其中的端倪.我就用叠罗塔实例来给你讲解.

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-10-21 18:38
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 

要理解递归程序,进栈和出栈的顺序,把它变成非递归程序会理解的很清楚!
好要知道:
1.任何递归程序都可以改为用栈模拟的非递归程序,无论递归本身多么的复杂。
2.一般情况,改后的非递归程序的效率好于原递归程序。
楼主不要糊涂,递归程序没什么的,但不要死抠,从大局出发,从设计角度出发就会发现它的美丽所在!
以下的非递归程序可以帮助楼主理解递归的实现方式:

#include "iostream"
#include"stdio.h"
using namespace std;

#define MAXSIZE 20
typedef int listarr[MAXSIZE];
void listorder(listarr list, int left, int right)
{
int mid;
if (left<=right)
{ mid=(left+right)/2;
printf("%4d",list[mid]);
listorder(list,left,mid-1);
listorder(list,mid+1,right);
}
}

void listorder2(listarr list, int left, int right) {
struct {
int l;
int r;
}stack[MAXSIZE];
int top=0,mid;
while(left<=right||top) {
while(left<=right) { /*如果满足该条件,则一直调用listorder(list,left,mid-1);*/
mid=(left+right)/2;
printf("%4d",list[mid]);
stack[top].l=left; /*保存参数,入栈*/
stack[top].r=right;
++top;
left=left; /*修改参数*/
right=mid-1;
}
--top; /*退栈*/
left=stack[top].l;
right=stack[top].r;
mid=(left+right)/2; /*从新计算参数,listorder(list,mid+1,right);*/
left=mid+1;
right=right;
}
}

main()
{
int listarr[MAXSIZE]={18,32,4,9,26,6,10,30,12,8,45};
int left=0,right=10;
listorder(listarr,left,right);
printf("\n\n\n");
listorder2(listarr,left,right);
}

[此贴子已经被作者于2006-10-23 16:16:13编辑过]


要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2006-10-23 16:13
风之梦
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-8-31
收藏
得分:0 
    大家都是高手呀,能不能就递归的学习多指教一点呢?谢。我说的是在如果用递归以及其定义方面,比如说,怎么样想到用递归解决汉诺塔问题
2007-08-31 19:50
快速回复:郁闷!递归问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011946 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved