`

递归函数的使用for循环的一个问题解决

阅读更多

下面的代码递归一个树的结构会有一个确定,就是当传入的节点是有右兄弟rightSibling时,该右兄弟子树是没有被遍历,因为是nodeTemp-rightSibling,而不是node->rightSibling;

void InitialGraph(Node *node)
{

	if(node!=NULL)
	{
		gltMakeCylinder(node->triangleBatch,node->start_radius, node->end_radius,node->length, 50, 10);
		
	}
	for(Node *nodeTemp=node->next ; nodeTemp!=NULL ; nodeTemp=nodeTemp->rightSibling)
	{

		InitialGraph(nodeTemp);
		
	}
	
}
 

 可能会觉得把nodeTemp->rightSiblint直接改成node->rightSibling;就可以解决了,但是事实是进入了一个死循环(可能有些百般不得其解,只是相当于把指针提前一个而已),因为 nodeTemp!=NULL ; nodeTemp=node->rightSibling始终执行这一for条件,使用执行循环体。究其问题的根本就是始终使用Node->rightSibling导致nodeTemp指针一直没有改变,而我们上面的代码为啥没有进入死循环呢,因为nodeTemp=nodeTemp->rightSibling不断对nodeTemp进行移动改变。

所以我们要修改这个问题只要做修改node的指针就行了,然后在注意一些细节……

 

 

void InitialGraph(Node *node)
{

	if(node!=NULL)
	{
		gltMakeCylinder(node->triangleBatch,node->start_radius, node->end_radius,node->length, 50, 10);
	}
	for(Node *nodeTemp=node->next ; nodeTemp!=NULL ; nodeTemp=node)
	{

		InitialGraph(nodeTemp);
		node=node->rightSibling;
		if(node==NULL)
			break;
	}
	
}
 

经过测试上面的代码还是有问题的,就是后面的节点会遍历多次。所以,循环和递归最好不要同时使用。也就证明了

数据结构与算法(C++版)/唐宁九中遍历树的算法其实是不严密的。

分享到:
评论

相关推荐

    递归函数 递归排序法

    递归函数是指函数在执行过程中调用自身,每次调用都会产生一个新的子问题,直到子问题足够简单,可以直接求解,然后逐层返回结果,最终解决原始问题。递归的关键在于必须有一个明确的基本结束条件(也称为递归基),...

    for循环语句的翻译(递归下降法,四元式)

    在处理`for`循环时,我们会定义一个或多个递归函数来识别`for`语句的各个部分,如初始化、条件检查、更新等。 ```markdown 1. 函数 forStatement(): - 解析 "for" 关键字 - 调用 initExpression() 解析初始化...

    c++递归函数基本代码.zip

    递归函数必须满足两个条件:一是存在基本情况(base case),即问题可以直接求解而不需要进一步的递归;二是其他情况(recursive case)会将问题简化为规模更小的同类问题,直到达到基本情况为止。递归的核心在于...

    PHP 递归函数

    在PHP编程语言中,递归函数是一种特殊类型的函数,它会调用自身来解决复杂问题。递归通常用于处理树形结构、遍历目录、计算阶乘、解决斐波那契序列等。在这个主题中,我们将深入探讨PHP递归函数的工作原理、优缺点...

    for语句递归下降法

    递归下降法是基于函数递归的解析策略,每个非终结符对应一个解析函数,当解析到特定的文法规则时,会调用相应的函数进行处理。这种方法直观、易于理解,特别适用于LL(1)类型的文法。 在C++中,for语句的基本结构...

    FOR循环语句的翻译程序设计(递归下降法、输出四元式)

    在处理FOR循环时,递归下降法会定义一个或多个函数来对应FOR循环的各个部分,如初始化、条件检查、循环体和更新。例如: ```python def parse_for(): parse("for") parse("(") init = parse_init() cond = ...

    c++用递归的方法编写函数求Fibonacci级数_递归_

    以下是一个使用C++实现的递归Fibonacci函数的示例: ```cpp #include using namespace std; int fibonacci(int n) { if (n ) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } int ...

    Fibonacci数列(非递归的函数调用)

    斐波那契数列是一个经典的数学概念,在计算机科学中经常被用作算法示例和问题解决的工具。这个数列的定义是这样的:第一项F0等于0,第二项F1等于1,从第三项开始,每一项都等于前两项之和。即Fn = Fn-1 + Fn-2 (n >=...

    MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    MyBatis是一个功能强大且灵活的持久层框架,它支持自查询和递归查询,下面我们将探讨如何使用MyBatis实现 N级联动效果。 递归查询 递归查询是指在一个查询中调用自身的查询,以便实现某些复杂的查询逻辑。在...

    素因子分解,递归,c实现

    该程序是一个典型的使用递归实现素因子分解的例子,展示了如何通过递归算法高效地解决数学问题,并且通过C语言的具体实现加深了对递归原理的理解。此外,程序还涉及到了数组、循环以及基本的输入输出操作等C语言基础...

    递归函数大集成

    由于这是一个穷举法解决问题的例子,输出将列出所有符合条件的球员位置分配情况。 #### 3. 下楼梯问题 本问题要求计算从顶部到底部的不同走法数量,每次可以跳1、2或3个台阶。 **代码解析:** ```c #include #...

    编译原理课程设计-FOR循环 递归下降法 四元式

    递归下降解析器通过一系列递归函数来匹配输入的符号串,每个函数对应文法的一个非终结符。当解析到一个非终结符时,解析器会尝试调用相应的函数,直到遇到终结符或达到文法的起始符号。这种方法简单直观,但可能因...

    FOR循环语句的翻译程序设计(递归下降法、输出三地址表示)

    在处理FOR循环时,我们使用递归函数来匹配并解析每种循环结构。每个函数对应于一个语法构造,当遇到匹配的输入时,函数被调用,如果遇到子构造,则递归调用相应的函数。递归下降法简单且易于实现,但可能会遇到左...

    循环代替递归

    例如,一个简单的for循环可以用来遍历数组: ```python for i in range(len(array)): process(array[i]) ``` **递归的实现** 递归则常用于处理分治策略的问题,如树的遍历、斐波那契数列等。以计算阶乘为例: `...

    Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例

    在示例中,非递归函数gcd_test_one通过for循环构建了一个列表来存储所有能够同时整除a和b的数,然后使用内置函数max来找出这个列表中的最大值,即为两数的最大公约数。 在实际应用中,选择使用递归还是非递归方法取...

    3.7 函数的递归调用(ppt).pdf

    然后通过一个for循环,我们可以计算Fibonacci数列的前20项的平方和,并与第20项和第21项的乘积进行比较,以验证其特定性质。 递归调用在解决某些问题时非常有效,但需要注意的是,由于每次递归调用都会增加函数调用...

    java编写的递归与非递归

    在Java中编写递归函数时,需要注意两个关键点:**基本情况**(base case)和**递归情况**(recursive case)。 - **基本情况**:这是递归结束的条件。对于阶乘来说,基本情况通常是`n == 0`时返回`1`。 - **递归...

    循环和递归在算法中的应用

    例如,以下是一个计算阶乘的循环示例: ```cpp int CalcFactorial(int n) { int result = 1; int i; for(i = 1; i ; i++) { result = result * i; } return result; } ``` 递归则采用自调用的方式,通常包含...

Global site tag (gtag.js) - Google Analytics