递归调用

来源:互联网 发布:matlab数据导入及调用 编辑:程序博客网 时间:2024/04/29 19:44

所谓递归-recursive就是可以在方法里自己调用自己。

以下是一个最简单的递归(当然会是死循环,所以真正的递归不要这样写)

                  public void sayHi(){
                       System.out.println(“Hello!”);
                        sayHi(); //自己调用自己,会无数次的调用
}
以上的这个程序如果你运行的话,最终会StackOverFlow也就是堆栈溢出错误

   真正的递归应用之一:求某个数的阶乘 
                  public int fact(int n){
              
                if(n>0)
                   return n*fact(n-1);
           else
                 return 1;
}

 

假如参数是4它的调用顺序如下图1所示:


递归调用 
                 图1-递归调用示意图

 

int strlen(char *p)  // 注意! 不允许定义任何变量
{
  if( *p )
  return strlen(p + 1)+ 1;
  return 0;
}
int strlen(char* p, int add_num=0)
 {
    return '/0'==*p?add_num:strlen(p+1, add_num+1);
 }
用strlen()计算字符串的长度不包括'/0'
已知 char *str1="absde";
     char str2[]="absde";
     char str3[8]={'a',};
     char ss[] = "0123456789";
sizeof(str1)=4;
 sizeof(str2)=6;
      sizeof(str3)=8;
       sizeof(ss)=11
总之,对于指针,sizeof操作符返回这个指针占的空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而且而strlen不区分是数组还是指针,就读到/0为止返回长度。而且strlen是不把/0计入字符串的长度的。
 char a[]="abc/0efg";
    printf("%d",strlen(a));  ///3  遇 '/0'结束
 printf("%d",sizeof(a));     ///8  只是一个操作符
strlen和sizeof的区别:
sizeof在编译器求解,strlen在运行期求解,这是主要区别
其次strlen只能求C风格字符串长度sizeof()可以求很多类型的大小
是否计算'/0'
原创粉丝点击