C语言中的Python样式迭代器
发布时间:2020-12-16 23:30:04 所属栏目:Python 来源:网络整理
导读:python中的“yield”语句允许从过程进行简单迭代,这也意味着序列不需要预先计算并存储在“任意”大小的数组中. 是否有类似的方法从C过程迭代(带有yield)? 解决方法 下面是自我回答的社区维基副本,可以选择作为“答案”.请直接向上/向下指示实际的自我回答
python中的“yield”语句允许从过程进行简单迭代,这也意味着序列不需要预先计算并存储在“任意”大小的数组中.
是否有类似的方法从C过程迭代(带有yield)? 解决方法
下面是自我回答的社区维基副本,可以选择作为“答案”.请直接向上/向下指示实际的自我回答
这是我找到的方法: /* Example calculates the sum of the prime factors of the first 32 Fibonacci numbers */ #include <stdio.h> typedef enum{false=0,true=1}bool; /* the following line is the only time I have ever required "auto" */ #define FOR(i,iterator) auto bool lambda(i); yield_init = (void *)λ iterator; bool lambda(i) #define DO { #define YIELD(x) if(!yield(x))return #define BREAK return false #define CONTINUE return true #define OD CONTINUE; } /* Warning: _Most_ FOR(,){ } loops _must_ have a CONTINUE as the last statement. * * Otherwise the lambda will return random value from stack,and may terminate early */ typedef void iterator; /* hint at procedure purpose */ static volatile void *yield_init; #define YIELDS(type) bool (*yield)(type) = yield_init iterator fibonacci(int n){ YIELDS(int); int i; int pair[2] = {0,1}; YIELD(0); YIELD(1); for(i=2; i<n; i++){ pair[i%2] = pair[0] + pair[1]; YIELD(pair[i%2]); } } iterator factors(int n){ YIELDS(int); int i; for(i=2; i*i<=n; i++){ while(n%i == 0 ){ YIELD(i); n/=i; } } YIELD(n); } main(){ FOR(int i,fibonacci(32)){ printf("%d:",i); int sum = 0; FOR(int factor,factors(i)){ sum += factor; printf(" %d",factor); CONTINUE; } printf(" - sum of factors: %dn",sum); CONTINUE; } } 从http://rosettacode.org/wiki/Prime_decomposition#ALGOL_68获得了这个想法 – 但它在C中读得更好 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |