【问题标题】:Rotate function,using recursion in C, that takes an array and integer as input旋转函数,使用 C 中的递归,将数组和整数作为输入
【发布时间】:2019-07-03 02:53:14
【问题描述】:

第一次发帖,如果我的问题没有遵循指导方针,我深表歉意,但欢迎对我的问题和发布问题提供任何反馈:)!

我正在解决一个问题,需要编写一个带有两个参数的递归 void 函数,一个数组和一个整数计数 n,它将数组中的前 n 个整数向左旋转。

所以输入看起来像这样:

5 10 20 30 40 50

输出:

50 40 30 20 10

我已经使用递归编写了旋转函数,它似乎按预期工作。

#include <stdio.h>

void rotateLeft(int y[], int n){

   int temp;
   if (n > 1){
      temp = y[0];
      y[0] = y[1];
      y[1] = temp;
      rotateLeft(y + 1, n - 1);
   }
}

int main(void){

   int y[5];
   int n;
   int i = 0;

   //input number from user
   printf("Enter 'Count' number and 'elements' into array: ");
   scanf("%d", &n);
   for (i = 0; i < 5; i++){
      scanf("%d", &y[i]);
   }

   rotateLeft(y, n);

   for ( size_t i = 0; i < sizeof( y ) / sizeof( *y ); i++ ) printf( "%d ", y[i] );
    puts( "" );

   return 0;
}

我正在使用 Visual Code Studio,但在尝试运行此代码时遇到了两个问题。第一个是它从不询问我的输入,它只会在指定的数组位置输出随机数,例如: 3345345 345456 564565 56 4564

其他时候代码只是运行并且永不停止,我必须强制它停止。

此时我已经碰壁了,我很肯定问题出在我的主要功能中,但我已经在我的脑海中碰壁了去哪里。在过去的 5 年里我没有编码,所以我非常缺乏实践。

【问题讨论】:

  • 可能只是一个术语,但这看起来不像是左轮换。 40 怎么会在 50 之后立即结束?
  • 不要在循环定义中使用sizeof( y ) / sizeof( *y ),而是在定义y之后使用size_t nelem = sizeof( y ) / sizeof( *y );然后使用for (size_t i = 0; i &lt; nelem; ....)会更简洁
  • 这看起来像是反转,而不是旋转。
  • 我认为也不是。这是一个右旋转(但不是整个数组,只有第一个 n 元素)2 的条目交换前两个元素,3 旋转前三个元素,等等。
  • @Obsidian,发布第一次使用的确切输入和看到的输出。 “类似”是不够的。

标签: c recursion


【解决方案1】:

答案中的代码在使用gcc 编译时可以正常工作(并且输入n 小于或等于5,否则rotateLeft 方法将超出数组限制)。

由于scanf 的标准输入似乎不起作用,这可能与程序的构建方式有关(它应该是一个win32 或win64 子系统:控制台应用程序,链接:description of /SUBSYSTEM at Microsoft) .

【讨论】:

  • 如果您输入3 10 20 30 40 50 并以20 30 10 40 50 结尾,那rotateLeft 又如何?
  • @DavidC.Rankin 它将前 3 个数字向左旋转!
  • 确实问题描述说:“将数组中的前 n 个整数向左旋转。”这正是代码在做什么!
  • 我明白你在说什么,向左旋转 3 个数字(一次)。
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>
//recursion 
//a b c d e
//round-1
//e b c d a
//round-2
//e d c b a
void Rec_ReverseAr(int y[], int n,int max_n){
   int temp;
   if (max_n > n*2){
      temp = y[max_n-n-1];
      y[max_n-n-1] = y[n];
      y[n] = temp;
      Rec_ReverseAr(y, n+1,max_n);
   }
}
//inplace
void Better_ReverseAr(int y[],int max_n){
    int Upper=max_n/2,i,temp;
    for (i = 0; i < Upper; i++){
        temp = y[max_n-i-1];
        y[max_n-i-1] = y[i];
        y[i] = temp;
    }
}


int main(){

    int *y;
    int n;
    int i = 0;

    //input number from user
    printf("Enter 'Count' number and 'elements' into array: ");
    scanf("%d", &n);
    if(n<1){//prevent nagtive int
        printf("Hey You Enter Wrong Number!\n");
        return 0;
    }
    y=(int*)malloc(sizeof(int)*n);//alloc amount n of int for y
    for (i = 0; i < n; i++){
        scanf("%d", &y[i]);
    }

    Rec_ReverseAr(y,0,n);
    //Better_ReverseAr(y,n);
    for (i = 0; i < n; i++ ){
        printf( "%d ", y[i] );
    }



    free(y);//release memory of y

    return 0;
}

你来了

your function
void rotateLeft(int y[], int n){

   int temp;
   if (n > 1){
      temp = y[0];
      y[0] = y[1];
      y[1] = temp;
      rotateLeft(y + 1, n - 1);
   }
}

0.a b c d e f
1.*b a* c d e f
2.b *c a* d e f
3.b c *d a* e f
...
is wrong

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2020-02-16
    • 2023-04-05
    • 2017-10-24
    相关资源
    最近更新 更多