C编程中带递归的反向数组
Reverse array with recursion in C programming
我在尝试使用递归进行反向数组时遇到了一些问题。这是函数原型:
void rReverseAr(int ar[ ], int size);
这是我的代码:
int main()
{
int ar[10], size, i;
printf("Enter array size: ");
scanf("%d", &size);
printf("Enter %d numbers: ", size);
for (i = 0; i<size; i++)
scanf("%d", &ar[i]);
rReverseAr(ar, size);
printf("rReverseAr(): ");
for (i = 0; i<size; i++)
printf("%d ", ar[i]);
return 0;
}
void rReverseAr(int ar[], int size) {
int start = 0, end = size - 1, temp;
if (start < end) {
temp = ar[start];
ar[start] = ar[end];
ar[end] = temp;
start++;
end--;
rReverseAr(ar, size - 1);
}
}
当用户输入 1 2 3
时预期的输出应该是 return 3 2 1
。但是,使用这些代码,我得到的输出是 2 3 1
。
有什么想法吗?
您的代码几乎是正确的。唯一的问题是,你不是从两侧 "shrinking" 数组,而是只从后面收缩它。
递归调用应如下所示:
rReverseAr(ar + 1, size - 2);
不需要自增start
或自减end
,因为它们的值修改后不再使用
一个简单的方法:
#include<stdio.h>
using namespace std;
void revs(int i, int n, int arr[])
{
if(i==n)
{
return ;
}
else
{
revs(i+1, n, arr);
printf("%d ", arr[i]);
}
}
int main()
{
int i, n, arr[10];
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
revs(0, n, arr);
return 0;
}
在 C 中使用递归迭代数组:link
你正在做的是交换第一个和最后一个元素的值并进行递归。
每次都应该将地址移动到下一个元素,作为下一次数组交换的起始。
一种可能的方式:
void rReverseAr(int ar[], int size){
int buffer=ar[0];
ar[0] = ar[size-1];
ar[size-1] = buffer;
if ((size!=2)&&(size!=1)) rReverseAr(ar+1,size-2);
}
我在尝试使用递归进行反向数组时遇到了一些问题。这是函数原型:
void rReverseAr(int ar[ ], int size);
这是我的代码:
int main()
{
int ar[10], size, i;
printf("Enter array size: ");
scanf("%d", &size);
printf("Enter %d numbers: ", size);
for (i = 0; i<size; i++)
scanf("%d", &ar[i]);
rReverseAr(ar, size);
printf("rReverseAr(): ");
for (i = 0; i<size; i++)
printf("%d ", ar[i]);
return 0;
}
void rReverseAr(int ar[], int size) {
int start = 0, end = size - 1, temp;
if (start < end) {
temp = ar[start];
ar[start] = ar[end];
ar[end] = temp;
start++;
end--;
rReverseAr(ar, size - 1);
}
}
当用户输入 1 2 3
时预期的输出应该是 return 3 2 1
。但是,使用这些代码,我得到的输出是 2 3 1
。
有什么想法吗?
您的代码几乎是正确的。唯一的问题是,你不是从两侧 "shrinking" 数组,而是只从后面收缩它。
递归调用应如下所示:
rReverseAr(ar + 1, size - 2);
不需要自增start
或自减end
,因为它们的值修改后不再使用
一个简单的方法:
#include<stdio.h>
using namespace std;
void revs(int i, int n, int arr[])
{
if(i==n)
{
return ;
}
else
{
revs(i+1, n, arr);
printf("%d ", arr[i]);
}
}
int main()
{
int i, n, arr[10];
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
revs(0, n, arr);
return 0;
}
在 C 中使用递归迭代数组:link
你正在做的是交换第一个和最后一个元素的值并进行递归。
每次都应该将地址移动到下一个元素,作为下一次数组交换的起始。
一种可能的方式:
void rReverseAr(int ar[], int size){
int buffer=ar[0];
ar[0] = ar[size-1];
ar[size-1] = buffer;
if ((size!=2)&&(size!=1)) rReverseAr(ar+1,size-2);
}