免责声明:这是一项练习,但不是作业。
现在,我们走了。练习要求将通用数组旋转到左侧,将第一个元素放在最后一个位置,并使用递归执行此操作。我的想法:
这是我写过的正确轮换:
void moveArrayRight (int array[], int dim){
if(dim!=1){
int holder;
holder = array[dim-1];
array[dim-1]=array[dim-2];
array[dim-2]=holder;
moveArrayRight(array, dim-1);
}
}
事情是:我不能(我认为)对左边使用相同的技术。我可以添加另一个参数(从技术上讲,我可以使用我想要的任何东西),但我非常不喜欢它。如果可能,我想只保留两个参数。我还想过做一些事情,比如使用数组的最后一个元素来存储下一个单元格中的内容,但我不知道如何实现它主要是出于某种原因:我不知道如何保留数组的原始维度。
有任何想法,提示或类似的东西吗?
答案 0 :(得分:3)
void rotate_left( int a[], size_t n )
{
if ( n > 1 )
{
int tmp = a[0];
a[0] = a[1];
a[1] = tmp;
rotate_left( a + 1, n - 1 );
}
}
以下是功能用法的示例
#include <stdio.h>
void rotate_left( int a[], size_t n )
{
if ( n > 1 )
{
int tmp = a[0];
a[0] = a[1];
a[1] = tmp;
rotate_left( a + 1, n - 1 );
}
}
int main( void )
{
int a[] = { 1, 2, 3, 4, 5 };
for ( size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++ ) printf( "%d ", a[i] );
puts( "" );
rotate_left( a, 5 );
for ( size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++ ) printf( "%d ", a[i] );
puts( "" );
return 0;
}
输出
1 2 3 4 5
2 3 4 5 1
答案 1 :(得分:0)
要有效地使用递归,您可以分割工作,例如在中间,而不是一次只切掉一个项目。类似的东西:
function shiftLeft(arr, start, len, in) {
var result;
if (len == 1) {
result = arr[start];
arr[start] = in;
} else {
var half = Math.floor(len / 2);
in = shiftLeft(arr, start + half, len - half, in);
result = shiftLeft(arr, start, half, in);
}
return result;
}
用法:
shiftLeft(arr, 0, arr.length, arr[0]);
(免责声明:代码未经过测试,可能有错误,我在手机上写了这个。)