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 に答える