目录
1.模拟实现一个strlen函数计算字符串长度
①普通
int my_strlen(char* str) {
int count = 0;
while (*str !='\0') {
count++;
str++;
}
return count;
}
int main() {
char arr[] = "Yoshikitty";
printf("%d", my_strlen(arr));
return 0;
}
②使用函数递归(不新建临时变量)
*str表示字符的地址,+1表示跳到第二个字符的地址
int my_strlen(char* str) {
if (*str !='\0')
return 1+my_strlen(str+1);
else
return 0;
}
int main() {
char arr[] = "HideForever";//ctrl+D复制上行
printf("%d", my_strlen(arr));
return 0;
}
2.递归实现阶乘
int jiecheng(int x) {
if (x <= 1)
return 1;
else
return x * jiecheng(x - 1);
}
int main() {
int ret = 0;
scanf("%d", &ret);
int sum = jiecheng(ret);
printf("%d的阶乘为:%d", ret, sum);
return 0;
}
3.递归实现斐波那契数列 (每一项都是前两项之和)
int fab(int n) {
if (n <= 2)
return 1;
else
return fab(n - 1) + fab(n - 2);
}
int main() {
int a = 1;
while (a < 5) {
int ret = 0;
printf("请输入一个数: ");
scanf("%d", &ret);
int sum = fab(ret);
printf("第%d次 斐波那契数列的第%d项为:%d\n",a, ret, sum);
a++;
}
return 0;
}
不足之处:无法计算过大的数,会重复计算
当计算第四十个斐波那契数时,计算了n次fab(3),工程量庞大!
修改:c为前两项a+b,算出后重新赋值
int fab2(int n) {
int a = 1;
int b = 1;
int c = 1;
while (n>2) {
c = a+b;
a = b;
b = c;
n--;
}
return c;
}
4.实现字符串倒序输出
int mylen(char* str) {
int count = 0;
while (*str!='\0')
{
count++;
str++;
}
return count;
}
void nixu(char* str) {
char tmp;
int left = 0;
int right = mylen(str)-1;
while (left < right) {
tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
int main() {
char arr[] = "abcdef";
nixu(arr);
printf("%s", arr);
return 0;
}
5.计算每一位数之和
int digitsum(int n) {
if (n > 9) {
return digitsum(n / 10)+n%10;
}
return n;
}
int main() {
int num = 1729;
int sum = digitsum(num);
printf("%d", sum);
}
6.用递归实现n的k次方相乘
double Pow(int n, int k) {
if (k > 0)
return n * Pow(n, k - 1);//n的k次方= n * Pow(n, k - 1)
else if(k<0)//考虑正负数
return 1.0/ (Pow(n,-k ));
else
return 1;
}
int main() {
int n = 0;
int k = 0;
scanf("%d %d", &n,&k);
double ret = Pow(n,k);
printf("%lf", ret);
}