我想用一个全局变量来控制递归的深度,但是不行呀,怎么办?

Januarius_ 2002-05-30 04:41:51
上课讲的网络通讯中的洪泛算法,我想编程来实现,用递归,但是其中要控制递归的深度,如果是直线递归的话,用一个全局变量就能搞定了,但我的递归是要有分叉的,控制在5层,这样不行。简单地说,有3个节点a,b,c,b和c是a的子节点,如果在循环中由a递归到b,这时到了要求的深度,循环就应该break,但是其实还有一个与b处于相同层次的c没有递归到,这种情况应该怎么控制呢?这不同于树。不能用树的遍历方法来实现,不知道我讲清了没有,我写的程序如下,但是有错误,多谢各位高手相助!
#include <iostream>
using namespace std;
int graph[6][6]={{0,1,1,1,0,0},{1,0,1,1,0,0},{1,1,0,1,1,1},{1,1,1,0,1,0},{0,0,1,1,0,1},{0,0,0,0,0,0}}; //图,相邻节点用1表示,0表示两节点间没边
int count=0; //网络负荷,一个节点相邻一个节点发送一个数据包,负荷增一
int num[6]={0,0,0,0,0,0};
int m=0;
void send(int i,int j) {
m++;
int a;
for(a=0;a<6;a++) {
if(m==5) {
m=0;
break;
}
if(graph[j][a]==1 && a!=i) { //节点不能向刚收到数据
// 的节点发送数据
count++;
num[j]++;
cout<<j<<"->"<<a<<endl;
if(a!=5) //节点6为终点,不向外发送数据
send(j,a); }
}
}
int main() {
int i=0;
int b;
for(b=0;b<6;b++) {
if(graph[0][b]==1) {
num[0]++;
count++;
cout<<0<<"->"<<b<<endl;
send(0,b);
}
}
cout<<count<<endl;
for(int c=0;c<6;c++) {
cout<<c<<":"<<num[c]<<endl;
}
return 0;
}
...全文
321 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Januarius_ 2002-06-04
  • 打赏
  • 举报
回复
多些各位指点,结账!
mjm_d 2002-06-04
  • 打赏
  • 举报
回复
可以的老兄,全局变量和局部静态变量都是可以的
LionEagle 2002-06-04
  • 打赏
  • 举报
回复
这样试试:

......

for( a=0;a<6;a++ ) {0
if( (m==5) || (m==0) ) {
m=0;
break;
}
......

不过还是在参数中加 int deep 比较好
mylove0618 2002-06-04
  • 打赏
  • 举报
回复
上面已经有几位指出了解决的办法,即在函数中设定深度flag,并把它作为递归的参数,如果达到,递归结束。这应该是一种很不错的解决办法了。如果使用类似break的办法来结束多层递归,效率,可读性什么的肯定不会太好。所以楼主可以考虑考虑参数的办法。挺不错的。推荐。
GZCompiler 2002-06-04
  • 打赏
  • 举报
回复
为什么不看看我的程序呢?一定会帮你找到解决问题的方法的。

#include "stdafx.h"
#define DEPTH 10 //控制深度的值
void func(int a);

int main(int argc, char* argv[])
{
func(0);
return 0;
}

void func(int a)
{
printf("%d\n",a);
if(a>DEPTH)
return;
else
func(a+1);

}
kensta 2002-06-02
  • 打赏
  • 举报
回复
o,Januarius:
你的
if(m==5) {
m=0;
break;
}
是干什么的?是不是到深度到5就停止?
那么最好不要m=0了,不然返回后又可以继续递归了
zhrwolf1 2002-06-01
  • 打赏
  • 举报
回复
将你要控制递归的深度的变量传入,
每递归一次减1,在递归调用前用一个if语句判断下其值是否大于0就可以了
cycker 2002-05-31
  • 打赏
  • 举报
回复
study
xunknown 2002-05-30
  • 打赏
  • 举报
回复
示例函数,你可以转变成你需要的。
用局部变量:
void f()
{
static int i=5;
int j=i--;//当然,你可以不定义j的。
cout<<j<<endl;
if(!j)return;
f();
}
Januarius_ 2002-05-30
  • 打赏
  • 举报
回复
to kensta()
你的方法不行,我试过了,因为在递归过程中不能确定什么时候需要恢复m

另外,诸位,上面的加一个参数的方法好像可行
但有那么多人说用局部静态变量,哪位能不能给我实现一下呢?非常感谢!
kensta 2002-05-30
  • 打赏
  • 举报
回复
依我之见嘛:
void send(int i,int j) {
m++;
int a;
for(a=0;a<6;a++) {
if(m==5) {
m=0;
break;
}
if(graph[j][a]==1 && a!=i) { //节点不能向刚收到数据
// 的节点发送数据
count++;
num[j]++;
cout<<j<<"->"<<a<<endl;
if(a!=5) //节点6为终点,不向外发送数据
send(j,a); }
}
m--;//加这个看看!
}
wyq_linda 2002-05-30
  • 打赏
  • 举报
回复
添加一个局部变量,保存全局变量,递归完了后再恢复
中间你可以进行判断,就像寄存器的现场保存一样

void send(int i,int j,int deep=0)
{ int xxx;
..............
xxx=deph;
send(aaa,bbb,deep+1);
deph=xxx;
.............
}


IT_worker 2002-05-30
  • 打赏
  • 举报
回复
在send函数中增加一个变量吧
void send(int i,int j,int deep=0)
{
if(deep>5) return;
…………
send(aaa,bbb,deep+1);
}
GZCompiler 2002-05-30
  • 打赏
  • 举报
回复
void send(int i,int j)
{
m++;
int a;
.
.
.
send(j,a);

}
对于这样的函数,递归的各个层次里都回去定义自己新的变量a,然后使用
该变量进行循环:for(a=0;a<6;a++),又因为递归调用是在循环体内部,
所以循环语句中的a++操作永远得不到执行,会导致无限递归。
所以,要将计数器层层递增的传递,而不是每次都新定义一个。
试试我上面写的func()递归函数,很容易理解的.
GZCompiler 2002-05-30
  • 打赏
  • 举报
回复
不需要全局变量,通过函数的一个参数进行递增传递,然后在特定深度函数return 就可以了。
AdvRom 2002-05-30
  • 打赏
  • 举报
回复
诸位,局部静态变量如果可以的话,全局变量怎么会不可以?
应该解决问题而不是逃避问题!
GZCompiler 2002-05-30
  • 打赏
  • 举报
回复
看看我的递归函数:

#include "stdafx.h"

#define DEPTH 10 //控制深度的值

void func(int a);

int main(int argc, char* argv[])
{
func(0);
return 0;
}

void func(int a)
{
printf("%d\n",a);
if(a>DEPTH)
return;
else
func(a+1);

}
AdvRom 2002-05-30
  • 打赏
  • 举报
回复
诸位,局部静态变量如果可以的话,全局变量怎么会不可以?
应该解决问题而不是逃避问题!
opengl3d 2002-05-30
  • 打赏
  • 举报
回复
利用局部静态变量
HostOOP 2002-05-30
  • 打赏
  • 举报
回复
在递归函数里定义static变量,用这个变量来控制深度。我以前在学校在作树的深度搜索是就是这样控制的。
good luck
加载更多回复(1)

70,014

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧