朝-
次のようなシーケンスを生成する関数が必要です。
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;
}