编写一个函数实现n的k次方,使用递归实现。
double mypow(int n, int k)
{
if (k == 0)//k=0
return 1;
else if (k > 0)//k>0
return n * mypow(n, k - 1);
else//k<0
return 1 / mypow(n, -k);
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
double ret = mypow(n, k);
printf("%lf\n", ret);
return 0;
}
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19
输入:1729,输出:19
下面是两个版本的函数,都可以实现此功能,区别就在于递归停止条件不同。
int DigitSum(int n)//版本1:函数多调用了一次
{
if (n != 0)
return n % 10 + DigitSum(n / 10);
else
return 0;
}
int DigitSum(unsigned int n)//版本2:效率比版本1高
{
if (n <= 9)
return n;
else
return DigitSum(n / 10) + n % 10;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = DigitSum(n);
printf("%d\n", ret);
return 0;
}
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
思路分析
不妨先看一下下面补充的非递归的实现方法,函数体内实现了元素交换,从两头开始到中间进行元素交换,递归的实现方法也是基于这种思想的。
- 第一步,将a放入一个临时变量当中
- 第二步,将f放入a的位置,也就是把f赋值给a
- 第三步,将‘\0’放入f之前所在的位置
- 第四步,将中间4个元素进行递归
- 第五步,将a放入’\0’所在的位置
第一,第二,第五步应该好理解,就是进行元素交换嘛。
第三步的作用:将’\0’放在后面时,数组的结束标志就向前移动一位,那么第四步调用函数的时候计算字符串长度的时候,因为是mystrlen(arr+1)
,指针向后移动一位,而结束符’\0’向前移动一位,字符串长度正好减少2,把交换过的元素排除掉,这样调用函数reverse_string(string + 1)
,就直接能进行中间元素的元素交换
size_t mystrlen(char arr[])
{
if (*arr == '\0')
return 0;
else return 1 + mystrlen(arr + 1);
}
void reverse_string(char* string)
{
size_t sz = mystrlen(string);
char tmp = string[0];
string[0] = string[sz - 1];
string[sz - 1] = '\0';
if (strlen(string+1)>=2)//当字符串长度为1或为0时,不再递归
{
reverse_string(string + 1);
}
string[sz - 1] = tmp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
补充:非递归实现
size_t mystrlen(char arr[])
{
size_t count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
void reverse_string(char* string, size_t sz)
{
size_t left = 0;
size_t right = sz - 1;
while (left < right)
{
int tmp = string[left];
string[left] = string[right];
string[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}