早晨-
我需要一个能够产生以下外观序列的函数:
1, -1, 2, -2, 3...
尾递归函数会是处理这个问题的最佳方法吗?有没有办法迭代而不是递归地做到这一点?
这个序列有一个简单的非递归形式:
A[n] = (n + 1) / 2 - (n % 2 ? 0 : n)
取决于索引。
return (n>>1) * -(n&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;
}
如果我正确理解了这个问题,那么像下面这样的简单功能会有所帮助。如果你想对它做更多的事情,你需要编写更多的代码。
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));
您可以使用迭代方式构建您的序列。
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;
}