浅谈数组逆序非递归和递归

浅谈数组逆序非递归和递归

非递归方式

#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.用保存的下来的首字母,替换当前的尾字符

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天津 唐秙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值