1.字符串逆序(循环)
(1)字符串逆序应该是字符之间交换位置,而不是逆序打印结果;
(2)right = sz - 2 因为字符串末尾包含"\n",计算字符串长度时"\n"也被计算在内,同时right表示的是下标,所以最后要减去2;
(3)left++ right-- 是循环结束条件,不加会造成死循环,且无法达到既定目标。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//字符串逆序(非递归)
int main()
{
char arr[] = "abcdefg";
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 2;
while (left <= right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s\n", arr);
return 0;
}
2.字符串逆序(函数递归)
(1)首先观察主函数,arr数组本质上是首元素地址,因此将实参传入fun函数时,要取地址*;
(2)要将"abcdefg"实现倒序,逻辑上可先将a与g的位置调换,再将剩下的"bcdef"倒序。而要实现"bcdef"倒序,可先将b与f的位置调换,再将剩下的"cde"倒序......由此我们可以利用函数递归。即先将a的值(*str)暂时存放在tmp中,再将g(也就是*(str+len-1))放入原来a的位置(*str)。但是此时出现一个问题,假如我们接下来马上把a的值,赋入*(str+len-1)中,也就是赋入原来g所在的位置,等到下一次调用函数时,a会替代我们原本的f,与b交替位置。为了规避这个问题,我们暂缓a位置的摆放,而选择将"\n"放入*(str+len-1),同时要注意下一次调用fun函数时,参数要使用str+1(使得交换对象为b和f),调用完后,这时可以将a进行摆放;
(3)函数递归的使用要注意限制条件,避免形成死递归。我们的目的是将字符串进行倒序排列,一头一尾两两交换位置,因此只要未进行交换的字符串长度>=2, 我们的递归仍要进行。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void fun(char* str)
{
char tmp = *str;
int len = strlen(str);
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (strlen(str + 1) >= 2)
{
fun(str + 1);
}
*(str + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdefg";
fun(arr);
printf("%s\n", arr);
return 0;
}
3.a的b次方(函数递归)
(1)考虑b的大小(零,正, 负)对结果的影响,从而进行不同的运算
(2)b小于零时,要考虑函数pow(int a, int b)取值的范围,因为结果可能为小数,所以要用double类型进行命名。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
double pow(int a, int b)
{
if (b == 0)
return 1;
if (b > 0)
return a * pow(a, b - 1);
else
return 1.0 / pow(a, -b);
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
pow(a, b);
double ret = pow(a, b);
printf("%1f\n", ret);
return 0;
}

被折叠的 条评论
为什么被折叠?



