浅谈数组逆序非递归和递归
非递归方式
#define N 10
#include <stdio.h>
void ReverseArr(int* a, int n)
{
for (int i = 0; i <= n / 2; i++)
{
int tmp;
tmp = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = tmp;
}
}
int main()
{
int arr[N] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
ReverseArr(arr, N);
for (int i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
数组初始化需要写明数组的大小,不能写成变量,因此,此处使用了一个宏进行定义,然后,如果需要交换只需要使用是一个for循环把数组中第一个值和最后一个值进行交换,非递归的形式比较简单,这里就不讲太多的了。
递归方式打印输出
#include <stdio.h>
void reverse_string(char* string)
{
if (*string != 0)
{
reverse_string(string + 1);
}
//减去\0
string--;
printf("%c", *string);
}
int main()
{
char arr[] = "student";
int n;
reverse_string(arr);
return 0;
}
这一部分我们是使用递归的方式查找最后一个数组的元素并且是直接打印了出来,这里我们只是进行了数组的逆序打印,但实际上并没有改变数组的元素顺序,逻辑上比较简单,但是实际中并不推荐,因为,在实际的开发过程中,函数的调用通常是修改或者得到一个返回值,然后在主函数中对返回值进行判断,或者是直接将值进行修改,然后把修改的值有可能会成为另一个函数的值,接着被调用,因此,如果只是为了逆序打印出来,可以使用,别的情况就不推荐了,更好的递归方法可以参考下一个。
递归方式逆序存储数组打印
#include <stdio.h>
#include <string.h>
int my_string(char* a)
{
if (*a == '\0')
{
return 0;
}
else
{
return 1 + my_string(a + 1);
}
}
void ReverseOrder(char a[])
{
char temp = a[0];
int n = my_string(a);
a[0] = a[n - 1];
a[n - 1] = '\0';
int m = my_string(a + 1);
if (m > 1)
{
my_string(a + 1);
}
a[n - 1] = temp;
}
int main()
{
char arr[10] = { 0 };
scanf("%s", arr);
ReverseOrder(arr);
printf("%s", arr);
return 0;
}
这个方法相对于上一个方法就有了很大的改进,它是使用递归的方法直接在原数组中将数组的顺序改变,然后保存了起来,这让就是在主函数中,如果想要再使用逆序后的数组也是可以的,属于一劳永逸的方法,但是数组采用递归的方式逆序相比于非递归的方式逻辑上还是比较复杂的,因此,在实际情况中,建议还是使用非递归,但是递归的方式也是需要掌握的,面试中可能还是会出现的(可以不用,但是必须要会写)。总结代码的书写思路如下:
1.保存首字符
2.尾字符替换首字母
3.尾字符变为\0
4.递归调用
4.1判出条件
4.2传参是传递当前字符串的第二个字符开始的字符串
5.用保存的下来的首字母,替换当前的尾字符