所谓递归-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所示:
int strlen(char *p) // 注意! 不允许定义任何变量
{
if( *p )
return strlen(p + 1)+ 1;
return 0;
}
{
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";
char str2[]="absde";
char str3[8]={'a',};
char ss[] = "0123456789";
sizeof(str1)=4;
sizeof(str2)=6;
sizeof(str3)=8;
sizeof(ss)=11
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 只是一个操作符
printf("%d",strlen(a)); ///3 遇 '/0'结束
printf("%d",sizeof(a)); ///8 只是一个操作符
strlen和sizeof的区别:
sizeof在编译器求解,strlen在运行期求解,这是主要区别
其次strlen只能求C风格字符串长度sizeof()可以求很多类型的大小
是否计算'/0'