2009-05-07 8 views
6

pythonの "yield"ステートメントは、プロシージャからの単純な反復を可能にします。また、シーケンスを事前計算する必要がなく、 "任意の"サイズの配列に格納する必要もありません。CのPythonスタイルのイテレータ

Cプロシージャから同様の反復処理(歩留まり)がありますか?

+0

尋ねるでどのような点で優れて読み込みますこの質問?あなたはあなたの評価を上げさせるためにあなた自身で答えるだけでしたか? 昨日Redditにあったので、偶然があるとは思わない。あなたは質問のために-1を、私からの答えは-1を得ます。 – qrdl

+0

あなたはSOで質問する必要があります。知識を共有することに感謝しますが、RedditやDiggのような場所がこれに適しています。あなたの間違いが意図せずに私の下垂体を元に戻すでしょう。 – qrdl

+4

@qrdlこれは長い時間前に処理されました(http://stackoverflow.com/questions/2572)NevilleDNZの動作は受け入れられるだけでなく、推奨されています。あなた自身の質問に対する答えに3つの投票を得るためのバッジを取得することさえできます。これは質疑応答の場です。どちらの人も両方を提供するということは、見下ろすものではありません。 –

答えて

6

ここでは、自己回答のコミュニティウィキのコピーが続きます。これは「the」回答として選択することができます。実際、自己の答えに/ downvotesを指示してください。ここ

は、私が見つけた方法です:

/* 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 *)&lambda; 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: %d\n", sum); 
     CONTINUE; 
    } 
} 

http://rosettacode.org/wiki/Prime_decomposition#ALGOL_68からアイデアを得た - しかし、それはC

+0

これはかなり素晴らしいようですが、それがどのように機能するか説明しています。私はオートブールラムダステートメント全体と非常に混同しています。 – parent5446

+0

OK、気にしないでください。分かったと思います。基本的には、反復されている実際のループを関数として宣言し、その後、反復関数内でその関数を呼び出します。 – parent5446

3

私はこのURLを時々冗談として外出します:Coroutines in C

私はあなたの質問に正解があると思います。直接の同等のものはなく、偽造しようとする試みは、きれいで使いやすいものではないでしょう。

0

No.

ニースとショート!

関連する問題