F1:常规首位替换
#include <stdio.h>
int main()
{
char arr[] = "abcdefg";
int left = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int right = sz - 2;
while (left <= right)
{
int t = arr[right];
arr[right] = arr[left];
arr[left] = t;
left++;
right--;
}
//下面一段可以直接不要,直接打印字符串
//printf("%s",arr);
int i = 0;
for (i = 0; i < sz-1; i++)
{
printf("%c", arr[i]);
}
return 0;
}
注意最后可以直接打印字符串,也可以把字符逐个打印出来。
另一方面字符串结尾有'\0',所以有8个字符,算right下角标时比原来少2;也就是right=sz-2
F2:递归法
#include <stdio.h>
void print(char* pa)
{
if (*pa != '\0')
{
print(pa + 1);
}
printf("%c", *pa);
}
int main()
{
char arr[] = "abcdefg";
print(arr);
return 0;
}
这个相当于:
abcdefg
运行abcdef 打印a(但运行bcdef优先级比打印a高,所以先进行下次递归)
运行bcdef 打印b
cdef c
def d
ef e
f f
\0此时开始打印f,然后回归到ef的程序,打印e以此类推
F3:递归法(首位交换打印)
#include <stdio.h>
#include <string.h>
test(char* pa)
{
//存放字符串
char tmp = *pa;
//求字符串长度
int len = strlen(pa);
//将g换到a的位置
*pa = *(pa + len - 1);
//把g这个位置变成'0'
*(pa + len - 1) = '\0';
//此时g变成首位,第七位原来g所在的位置现在是'\0'
//现在交换以b开头的字符串,开始进行递归
//但递归一定有限制条件,不然会进入死递归
//当只剩1个字符是,不需要再交换
if (*(pa + 1) >= 2)
{
//递归
test(pa + 1);
}
//将a存到g处
*(pa + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdefg";
test(arr);
printf("%s", arr);
return 0;
}
abcdefg,此递归法先将字符串赋给一个变量tmp,再交换a和g,然后在g的位置放入'\0',这样bcdef\0就成了新的字符串,在进入新的递归,最终将tmp中的a存到原来g的位置。以此类推
跟F2最大的不同之处在于,此递归法直接将字符存到数组中该交换的位置,直接在主函数中打印字符串就行了/
F4:当有多个元素时,可以用left和right递归
#include <stdio.h>
void test(char arr[], int left, int right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
//递归条件,left不能大于right
if (left < right)
{
test(arr, left + 1, right - 1);
}
}
int main()
{
char arr[] = "abcdefg";
int right = strlen(arr) - 1;
int left = 0;
test(arr, left, right);
printf("%s\n", arr);
return 0;
}
注意:求字符串长度要用strlen,不能用sizeof。