c - 数组向左旋转(递归)

标签 c arrays function recursion definition

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

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

这是我写的正确的轮换:

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

问题是:我不能(我认为)对左侧使用相同的技术。我可以添加另一个参数(从技术上讲,我可以使用任何我想使用的参数),但我非常不喜欢它。如果可能的话,我想只保留两个参数。我也想过做一些事情,比如使用数组的最后一个元素来存储下一个单元格中的内容,但我不知道如何实现它主要是因为一个原因:我不知道如何保留原来的数组的维度。

有什么想法、提示或类似的东西吗?

最佳答案

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 

关于c - 数组向左旋转(递归),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463076/

相关文章:

C fork : child proc-meant printf messages appear only after the whole program finishes

c - sigaction 将 SIGINT 传递给系统调用,但不传递信号

c - 在运行时将 char[x] 调整为 char[y]

c - 存储数组的子集

arrays - 检查数组元素是否是另一个数组中元素的子字符串的有效方法

java - 如何删除不明确的函数调用

c - C 语言的交互式随机程序

c - 如何获取字符**的长度?

c++ - 函数声明和签名有什么区别?

java - JNI : Converting C Function To Java Style Function