为什么非得要走冯诺依曼路线

 

C语言经典三大结构:循环,顺序,分支,是遵循冯诺依曼结构设计出来的。

C语言是贴近底层的语言,因此用它编程比较枯燥,开发周期慢。但是有时需要打破常规,跳出传统程序设计影响,多抽象出一些过程,不妨学学函数式编程

比如经典的反转链表,可以这样写:

typedef struct cons_cell {
        void * car;
        void * cdr;
}cons_cell;
typedef cons_cell * pcons_cell;

void * cons (void * car , void * cdr){
        pcons_cell p;
        p = (pcons_cell) malloc(sizeof(cons_cell));
        assert(p);
        p->car = car;
        p->cdr = cdr;
        return p;
}

#define CAR(c) (c)->car
#define CDR(c) (c)->cdr
#define nil NULL
void mapc(pcons_cell list , void (*func)(void* x))
{
        if(list==nil) return;
        void * cdr = CDR(list);
        func(CAR(list));
        mapc(cdr,func);
}

void print(void *x)
{
        printf("%d ",(int)x);
}

pcons_cell reduce(pcons_cell list, void * (*func)(void * x, void *y), void * result)
{
        if(list==nil) return result;
        return reduce(CDR(list), func,func(CAR(list),result));
}

int main (int argc, char * argv[])
{
        int i;
        pcons_cell a=nil;
        pcons_cell b=nil;

        for(i=0;i<10;i++){
                a = cons((void*)i,a);
        }
        b = reduce(a,cons,nil);

        mapc(a,print);
        puts("\n");
        free_cons(a);
        mapc(b,print);
        puts("\n");
}

reduce方法比较独特些,如果按常规来写reduce函数实现的功能的话,又得写几行赋值语句和FOR循环语句的交错,像机器思维那样。

结果是两行可以完成的事拖成十几行完成。

低级语言往高级语言的进化,就是为了摆脱冯诺依曼机器式思维的限制。同时为了以后快速开发的需要,可以以后看一些闭包,函数式编程方面的东西。函数也是一种变量,我们可以更抽象一点,把函数当变量用。代码是写给人看的,顺带在机器上执行。我们要慢慢忽略机器思维的影响,让代码成为抽象思维的反映。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值