C

时间:2018-02-15 17:22:08

标签: c recursion

问题如下:

  • 用三个参数编写一个递归函数:一个数组(a),即 数组的元素数(n)和数字 - k。
  • 如果k为正且小于n,则应打印第一个k正数 数组的数字。
  • 如果k为负且其绝对值小于n,则应打印前k个负数。
  • 如果k大于n且正数,则应打印所有正数。
  • 如果k大于n且负数应为负数 打印。

这是我的尝试

    #include <stdio.h>
    #include <stdlib.h>

    int function(int a[100], int n, int k)
    {
      int b[n], i;

      if (k!=0 && n>1)
      {
        for (i=0; i<n; i++)
        {
          b[i]=a[i+1];
        }

        if (k<n || abs(k)<n)
        {

         if (k>0)
          {
            if (b[0]>0)
            {
              printf("%d", b[0]);
              k=k-1;
            }
          }

          if (k<0)
          {
            if (b[0]<0)
            {
              printf("%d", b[0]);
              k=k+1;
            }
          }
          return function(b, n-1, k);
        }
      }

      else return 0;
    }

   int main() 
   {
     int i, n, a[100], k;
     printf("n = ");
     scanf("%d", &n);
     for (i=0; i<n; i++)
     {
       printf("a[%d] = ", i);
       scanf("%d", &a[i]);
     }
     printf("k = ");
     scanf("%d", &k);
     printf("The new array is: \n");
     function(a, n, k);
     return 0;
   }

但它只打印一个号码而且我不知道如何修复它。有谁知道我哪里出错了?

编辑:如果数组为{1,-1,2,-2,3,-3}且k = 2,则预期结果为{1,2}。如果k = -2,则预期结果为{-1,-2}

编辑2:b是一个数组,其中包含除[0]

以外的数组的所有元素

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在三个问题。

1)当我复制你的代码(转换为C#,因为那是我的工作)时,它在这里为我抛出了一个ArgumentOutOfRangeException:

for (i=0; i<n; i++)
{
  b[i]=a[i+1]; <------
}

i为99时,它会尝试将a[100]复制到b[99],但没有a[100]。您应该将for循环改为:

for (i=0; i<n-1; i++)

2)你的代码基本上像对待队列一样处理a并弹出第一个数字(通过将所有其他数字复制到一个新数组b),而不是查看第一个数字到确定是否要打印它,您正在跳过它并查看您刚刚放入b的第一个项目:

if (k>0)
{
    if (b[0]>0) <------
    {
        printf("%d", b[0]); <-----
        k=k-1;
    }
}

您应该更改比较(和printf行)以查看a[0]而不是b[0]

3)每当k大于n时,您的整个逻辑块都会被跳过(例如,我错误地将k设置为34而不是3,当我做的时候,if块读取if (34 < 6 || abs(34) < 6),这总是错误的。