目录
2.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
1.字符串逆序(以abcdef为例)
要求:1.递归实现;2.不能使用C语言中的的字符串操作函数
非递归解法
思路
建立字符数组,利用下标将第一个字符a与最后一个字符f交换,然后左、右下标分别+1和-1将字符b与e交换,以此类推,直到左标=右标
注意点:求字符长度如何使用自定义函数实现
int my_strlen(char* y)
{
int count = 0;
while (*y != 0)
{
count++;
y++;
}
return count;
}
void reverse_string(char* x)
{
int left = 0;
int right = my_strlen(x) -1;
while (left < right)
{
char temp = x[left];
x[left] = x[right];
x[right] = temp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
递归解法 (难点)
思路
1.abcdef,先将a取出
2.f放入a的位置(但此时f的位置不能放入a,因为下一次递归再进行替换,看到的是bcdea,会将b和a交换,因此f位置处应放入'\0')
2.递归的处理是字符串第一个元素与最后一个替换
3.最后将a放回最后一个元素位置
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//字符串逆序(*)——不允许使用字符串操作函数
//递归方式
int my_strlen(char* y)
{
int count = 0;
while (*y != 0)
{
count++;
y++;
}
return count;
}
void reverse_string(char* x)
{
char tmp = *x;//第1步
int len = my_strlen(x);
*x = *(x + len - 1);//第2步
*(x + len - 1) = '\0';//第3步
//判断条件
if(my_strlen(x+1)>=2)
{
reverse_string(x + 1);//第4步
}
*(x + len - 1) = tmp;//第5步
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
2.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
思路
每次取完x的个位数后,然后x除以10,进行下一次递归,直到值成为个位数,再将返回值相加
int DigitSum(int x)
{
int g = 0;
int m = 0;
if (x > 10)
{
m = x % 10;
x = x / 10;
g = m + DigitSum(x);
}
else
{
g = x;
}
return g;
}
int main()
{
int n = 0;
scanf("%d",&n);
int r=DigitSum(n);
printf("%d", r);
return 0;
}
优化
int DigitSum(int x)
{
if (x > 9)
{
return DigitSum(x/10)+x % 10;
}
else
{
return x;
}
}
int main()
{
int n = 0;
scanf("%d",&n);
int r=DigitSum(n);
printf("%d", r);
return 0;
}
3.编写一个函数实现n的k次方,使用递归实现
非递归函数代码:
double test(int x, int y)
{
int m = 0;
int num = 1;
while (m < y)
{
num = num * x;
m++;
}return num;
}
double test(int x, int y)
{
//实现负数
if (y == 0)
{
return 1.0;
}
else if (y > 0)
{
return x * test(x, y - 1);
}
else
{
return 1.0 / test(x, -y);
}
}
int main()
{
int n = 0;
int k = 0;
scanf("%d%d", &n, &k);
double g=test(n,k);
printf("%lf", g);
return 0;
}