2017-02-22 5 views
-1

私は配列要素にアクセスするための再帰関数を書いています。 2回目、3回目、4回目、それ以降、150回まで同じことをやりたいのですが反復で行います。私は以下のコードを書いていますが、最初の例は実行されていますが、正しいとは分からず、最初の関数と同じように動作します。私はこれを行うために私は2つのループを使用していることを知っている私は間違った場所にインデックスvarを配置している可能性があります。反復を使用する変換関数

void openarray(skip) 
{ 
    int i; 
    for(i = skip; i < 150; i+=skip + 1) 
    { 
     if(arrayB[i] == open) 
     { 
      arrayB[i] = close; 
     } 
     else 
     { 
      arrayB[i] = open; 
     } 
    } 
    if(skip < 150) 
    { 
     openarray(skip + 1); 
    } 
} 

私のコードは繰り返しになります。私はステップのインデックスを混同している可能性があります。

int i, j; 
for(i = 0; i < 150; i++) 
{ 
    for (j = 0; j < 150; j+=i + 1) 
    if(arrayB[i] == open) 
    { 
     arrayB[i] = close; 
    } 
    else 
    { 
     arrayB[i] = open; 
    } 
} 
+0

"正しいとは必ずしも分かりません。最初の機能と同じです"。それがテストの目的です。テストを設計して実行します。結果が間違っている場合は、コードが正しくないことがわかります。そこからデバッグを開始します。 Stackoverflowでの投稿は、テストやデバッグの第一歩ではありません。 – kaylum

+1

@kaylum iveは、すべてのインデックスを印刷していましたが、私はそれを理解できませんでした。iveはテストしていて、無礼な仮定をしていると思っていません。 – mikecodeguy

+2

それでは、どうしてそんなこと言わないのですか?テスト結果 - 入力、期待出力、実際の出力を共有します。それと[mcve]はあなたの特定の問題が何であるかを読者が知るために必要なすべてのSOの質問です。 – kaylum

答えて

0

ステップ1:最後に再帰呼び出しを入れてみましょう。

void openarray(skip) 
{ 
    int i; 
    for(i = skip; i < 150; i+=skip + 1) 
    { 
     if(arrayB[i] == open) 
     { 
      arrayB[i] = close; 
     } 
     else 
     { 
      arrayB[i] = open; 
     } 
    } 

    if(skip >= 150) 
     return; 

    openarray(skip + 1); 
} 

ステップ2:ループを追加します。

void openarray(skip) 
{ 
    while (1) { 
     int i; 
     for(i = skip; i < 150; i+=skip + 1) 
     { 
      if(arrayB[i] == open) 
      { 
       arrayB[i] = close; 
      } 
      else 
      { 
       arrayB[i] = open; 
      } 
     } 

     if(skip >= 150) 
      return; 

     skip = skip + 1; 
    } 
} 

ステップ3:

  • をあなたがゼロに外側のループカウンタを初期化:私たちは、あなたが作ったものをエラー見るためにあなたのコードに対してこれを比較することができ

    void openarray(skip) 
    { 
        for (; skip < 150; ++skip) 
        { 
         int i; 
         for(i = skip; i < 150; i+=skip + 1) 
         { 
          if(arrayB[i] == open) 
          { 
           arrayB[i] = close; 
          } 
          else 
          { 
           arrayB[i] = open; 
          } 
         } 
        } 
    } 
    

    をクリーンアップします。

  • 内部ループカウンタの代わりに外部ループカウンタをアレイインデックスとして使用しました。
+0

**不明瞭で不完全な質問**に基づいて回答しています。 'skip'変数の範囲は何ですか? 'openarray(-1)'を試してみてください。 –

+0

@メニンクス - メネックス、私は問題を見ない。リファレンスの再帰的な実装と提供される反復的な実装は、 'openarray(-1)'と同じように動作します(明らかに有効な入力ではありませんが)。 – ikegami

+0

@ikegamiありがとうございます。テストは再帰的アプローチと同じ出力を持つように見える – mikecodeguy

関連する問題