Loop.md 2.1 KB
Newer Older
F
feilong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
# 斐波那契数列

C# 的 foreach 可以遍历实现了迭代器接口的数据。以下哪个选项的代码不对?

## 答案

```csharp
int FibNumbers(int n){
    if(n==0) return 0;
    if(n==1) return 1;
    return FibNumbers(n-1) + FibNumbers(n-2);
}

foreach (int number in FibNumbers(7)) {
    Console.WriteLine($"{number}");
}
```

## 选项

### A

```csharp
int[] fibNumbers = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int number in fibNumbers) {
    Console.WriteLine($"{number}");
}
```

### B

```csharp
IEnumerable<int> FibNumbers(int n){
    yield return 0;
    yield return 1;

    int a = 0;
    int b = 1;
    for(int i=1;i<n;i++){
        int next = a+b;
        yield return next;
        a = b;
        b = next;
    }
}

foreach (int number in FibNumbers(7)) {
    Console.WriteLine($"{number}");
}
```

### C

```csharp
var fibNumbers = new FibNumbers(7);
foreach(int number in fibNumbers){
    Console.WriteLine($"{number}");
}

class FibNumbers : IEnumerable<int>{
    int n;
    FibNumbersEnumerator e;
    public FibNumbers(int n){
        this.n = n;
        this.e = new FibNumbersEnumerator(this.n);
    }
    public IEnumerator<int> GetEnumerator(){
        return this.e;
    }
    IEnumerator IEnumerable.GetEnumerator(){
        return this.GetEnumerator();
    }
}

class FibNumbersEnumerator : IEnumerator<int>{
    int n;
    int a;
    int b;
    int index;
    public FibNumbersEnumerator(int n){
        this.n = n;
        this.Reset();
    }

    public int Current{
       get { return this.a; }
    }

    object IEnumerator.Current{
       get { return this.Current; }
    }

    public bool MoveNext(){
       if(this.index<1){
            this.a = 0;
            this.b = 1;
       }else{
            int next = this.a+this.b;
            this.a = this.b;
            this.b = next;
            
       }
       
       this.index +=1;
       if(this.index==this.n+2){
           return false;
       }else{
           return true;
       }
    }

    public void Reset(){
        this.a = 0;
        this.b = 0;
        this.index = 0;
    }

    public void Dispose(){}
}
```