数组向左旋转(递归)

问题描述 投票:1回答:2

免责声明:这是一种练习,但不是家庭作业。

现在,我们开始。练习要求将通用数组向左旋转,将第一个元素放在最后一个位置,然后递归进行。我的想法:

这是我写的正确的轮换:

 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);
            }
 }

事实是:我不能(我认为)对左手使用相同的技术。我可以添加另一个参数(从技术上讲,我可以使用任何我想使用的参数),但我对此深为不满。如果可能的话,我只想保留两个参数。我还想做一些类似的事情,例如使用数组的最后一个元素存储下一个单元格中要存储的内容,但是我主要由于以下原因不知道如何实现它:我不知道如何保留原始元素数组的维度。

有任何想法,提示或类似的东西吗?

c arrays function recursion definition
2个回答
4
投票
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 

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]);

(免责声明:该代码未经测试,可能有错误,我在手机上写了。)

© www.soinside.com 2019 - 2024. All rights reserved.