3

早晨-

我需要一个能够产生以下外观序列的函数:

1, -1, 2, -2, 3...

尾递归函数会是处理这个问题的最佳方法吗?有没有办法迭代而不是递归地做到这一点?

4

5 回答 5

10

这个序列有一个简单的非递归形式:

A[n] = (n + 1) / 2 - (n % 2 ? 0 : n)

取决于索引。

于 2012-06-25T15:04:46.347 回答
3
return (n>>1) * -(n&1);
于 2012-06-25T16:49:43.557 回答
1

一种可能的方法是使用abs()函数:

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

int main()
{
    int i = 0;
    while (i-- > -10) printf(" %d %d", i, abs(i));
    printf("\n");
    return 0;
}
于 2012-06-25T15:08:31.613 回答
1

如果我正确理解了这个问题,那么像下面这样的简单功能会有所帮助。如果你想对它做更多的事情,你需要编写更多的代码。

void calc_sequence(int *arr, int size)
{
   int i=0;
   int j=0;


    for(i=1; i<=(size/2); i++)
    {
      arr[j] = i;
      arr[j+1] = -i;
      j = j+2;
    }
 }


 /* The below code should come in the calling function. n is the maximum positive number you plan to see in the sequence */

   int *arr = malloc((n*2) * sizeof(int));
   calc_sequence(arr, (n*2));
于 2012-06-25T15:14:11.107 回答
1

您可以使用迭代方式构建您的序列。

int *
f(size_t size)
{
    int *p = malloc(size * sizeof *p); // Checks for overflows

    for (size_t i = 0; i < size; ++i) {
        p[i] = (i + 1) / 2;
        if (i & 1) p[i] -= i;
    }

    return p;
}
于 2012-06-25T15:25:40.353 回答