proof 发表于 2016-11-22 15:46

如何产生这个数字序列?


变量 X=1

如何产生以下序列?(使X按序列值变化)
+1, 0, -1, 0, +1, 0, -1, 0, +1, ……

不要For循环, 越简单直接越好。可引入辅助整形变量a,b,c,比如这类形式:
a=-1
X=X+a^X

PS:这个问题是《组合数学》学科研究范围吗?

lxyscls 发表于 2016-11-22 17:48

回复 1# proof

不要For循环, 越简单直接越好你这话还真矛盾

BetonArmEE 发表于 2016-11-22 18:06

爻易 发表于 2016-11-22 19:11

静态 整型 待选集 = {1,0,-1};

内联 整型 检索序列(无符号 整型 索引) {返 待选集[索引%3];}

bruceteen 发表于 2016-11-23 08:40

y = (2-(x+1)%4)%2

#include <stdio.h>

int main( void )
{
    for( int x=0; x<20; ++x )
      printf( "%+d\n", (2-(x+1)%4)%2 );

    return 0;
}

proof 发表于 2016-11-23 09:20

本帖最后由 proof 于 2016-11-24 15:12 编辑

      索引法:待选集 = {1,0,-1};
通项公式法:y = (2-(x+1)%4)%2

感谢各位。

hellioncu 发表于 2016-11-23 10:56

本帖最后由 hellioncu 于 2016-11-23 10:59 编辑

struct foo
{
      unsigned int s:2;
      unsigned int v:1;
};


int bar(struct foo *p)
{
      p->s--; p->v--;
      return p->s == 3 ? -1 : p->v ;
}

int main()
{
      struct foo f;
      f.s = 2; f.v=0;
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));
      printf("%d\n", bar(&f));

      return 0;
}

sxcong 发表于 2016-11-24 14:44

不要For循环只能用递归了
尾递归应该是最合适的,同时看返回值和索引值。

sxcong 发表于 2016-11-24 15:03

不一定最简单,但最直接的方法:

int recursive(int n, int total)
{
        if (n >= total)
                return 0;
        int x = n%4;
        int ret = 0;
        switch(x)
        {
        case 0:
                ret = 1;
                break;
        case 1:
                ret = 0;
                break;
        case 2:
                ret = -1;
                break;
        case 3:
                ret = 0;
                break;
        }
        printf("%d", ret);
        return recursive(n+1, total);
}

main()
{
recursive(0, 1024);
}

proof 发表于 2016-11-24 15:10

感谢大家。:victory:
页: [1]
查看完整版本: 如何产生这个数字序列?