C语言中递归常见错误解析(1)
2017-04-19 21:40
429 查看
1.不要直接修改代码,否则会给下面的程序导致错误,【不能正确的读入需要的值】
2.代码示例
在上面的这个建树过程中,我们可以看到,这是一个递归函数,我们在遍历建左子树之后,可能需要遍历建右子树,但是若在遍历建左子树的时候修改了postRight以及inRight的值,导致在下面判断if(rootIndex<inRight)判断失误,从而导致递归失败。
4.总结
(1)在递归程序中,如果需要修改变量的值,最好是在函数调用过程中直接调用值,而不是修改之后再调用。
2.代码示例
BiTree* foundData(int postLeft,int postRight,int inLeft,int inRight){ int i,root;//需要添加到树中的根节点 int rootIndex;//记录根节点值在inOrder数组中的下标 root = postOrder[postRight];//根节点的值 for(i = inLeft;i <= inRight;i++){//是在中序数组左右区间中找匹配!! /** 1.如果说两者值相等,即在中序遍历序列中找到了根节点值,就记录下根节点值在中序数组中 的下标。 **/ if(inOrder[i] == root ){ rootIndex = i;//记录相等时的下标值 break;//找到后不再寻找 } } //往树中添加信息 BiTree* T = new BiTree;//指向一个结点 T->data = root;//建立根节点的值 //先遍历左子树 if(rootIndex > inLeft){//如果还有左子树 int leftTreeNumber ;//查看左子树有多少 leftTreeNumber = rootIndex - inLeft; postRight = postLeft + leftTreeNumber - 1;//postRight后移leftTreeNumber位 inRight = rootIndex - 1; T->lChild=foundData(postLeft,postRight,inLeft,inRight);//找左子树 } //接着遍历右子树 if(rootIndex < inRight){//还有右子树 postRight = postRight -1; inLeft = rootIndex + 1; T->rChild=foundData(postLeft,postRight,inLeft,inRight);//找右子树 } return T;//返回 }3.分析
在上面的这个建树过程中,我们可以看到,这是一个递归函数,我们在遍历建左子树之后,可能需要遍历建右子树,但是若在遍历建左子树的时候修改了postRight以及inRight的值,导致在下面判断if(rootIndex<inRight)判断失误,从而导致递归失败。
4.总结
(1)在递归程序中,如果需要修改变量的值,最好是在函数调用过程中直接调用值,而不是修改之后再调用。
相关文章推荐
- 常见c语言编译错误解析
- 常见c语言编译错误解析
- 常见c语言编译错误解析
- 常见c语言编译错误解析(转)
- 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)
- 常见C语言编译错误解析【转】
- 常见c语言编译错误解析
- C语言中的一些常见错误
- 在SSIS中,使用“包配置”时的常见错误与解析
- 【整理】C语言上机程序调试功能键及常见错误提示
- C语言常见错误小结
- 开发常见错误解决(4)WSE3.0解析策略文档失败,Failed parsing the policy document
- Excel常见错误信息解析
- C语言常见错误
- c语言常见错误说明
- C语言编程中常见的错误
- Django 常见错误解析
- 局域网最常见十大错误解析
- c语言编程的常见错误
- 在SSIS中,使用“包配置”时的常见错误与解析