
void inOrder(BiTreeNode t , int n)
/使用visit(item)函数中序遍历二叉树t/
{
if(t != NULL)
{
inOrder(t->leftChild, n);
if(t->leftChild==NULL&&t->rightChild==NULL)
{
printf("子叶:%c",t->data);
n += 1 ;
}
inOrder(t->rightChild,n);
}
}
调用函数中,设置一个变量x,初值为0,参考如下:
int main()
{
int x=0;
BiTreeNode tree ;
//二叉树赋值部分,省略
inOrder( tree ,&x);
printf("x=%d\n", x );
return 0;
}
为了防止递归调用无终止地进行, 必须在函数内有终止递归调用的手段。常用的办法是加条件判断, 满足某种条件后就不再作递归调用,然后逐层返回。
一个函数在它的函数体内调用它自身称为递归调用。 这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中, 主调函数又是被调函数。执行递归函数将反复调用其自身。 每调用一次就进入新的一层。
int f (int x)
{
int y;
z=f(y);
return z;
}
你的递归函数没有返回,永远也不会结束。n<=0 后在函数并不会结束,只是在n为负数阶段不会输出,但是n不断-1必然最终会翻转为正整数,然后n从最大的正整数开始递归输出到n<=0,如此循环往复,当然最终内存超限了。
解决办法很简单,给递归函数加个中止条件就行了,符合条件就返回。
void fudu(char ch, int n, int x)
{
int i;
if (n == 1)
{
printf("%c", ch);
return;
}
for (i = 0; i < n; i++)
{
printf("%c", ch);
}
fudu(ch, n - 1, 1);
}
递归就是调用自己的意思,而且你写错了,应该是return ans;返回值是自己,而不是0;比如说,实参传递形参给它n=2;
你如果觉得调用自己不明白的话,你就把上面的函数定义成:
fact1,fact2,fact3他们只是名字不一样,自定义函数的内容都是完全相同的。
然后自定义函数fact1开始运行:
n>0;成立,执行ans=nfact2(n-1); //相当于ans=2fact2(n-1);
ans这句语句调用fact2自定义函数,实参n-1=1传给fact2的形参。
n>0;成立,执行ans=fact3(n-1); //这是n=1,形参收到的数据是1,1fact3(n-1)
实参n-1=0传给fact3的形参;
n>0不成立,直接ans=1。
之前都是调用的过程,下面是返回值
先是从fact3返回1,返回到fact2,
fact2中ans=11=1,这个值返回到fact1;
fact1中ans=21=2,这个值返回到主函数。
同理,如果n=5的话,相当于要写fact1,fact2……fact6这6个函数。
返回的结果是112345=120到主函数。
但是如果你把这六个函数都写出来,要浪费多少时间,既然他们的内容都是一样的,为什么不把名字定为1个,然后自己调用自己,这就形成了递归函数了。
递归函数相当于调用多次自定义函数,而每次调用的对象都是同一个,只是每次传递的参数发生了变化。
希望你多看几遍,不明白继续问,纯手写,望采纳。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)