1

これには問題があります。基本的に、50 個の項目の配列をソートし、最大数を LED に表示する 2 つのバージョンのプログラムを作成するように依頼されました。基本的なバブルソートを使用して動作させ、表示しています。私の問題は、再帰を使用してこれを行う必要がある場合です。残念ながら、再帰に関する私の知識は非常に限られており、それに関する講義を見逃してしまいました..-彼はまた、ノートをオンラインに載せていません. 私は長いグーグルを持っていましたが、まだ頭を悩ませていません。そこで、いくつかお尋ねします。まず、sedo コードを使用したバブル ソートに関連する再帰について誰かが説明してくれませんか。第二に、私の試みは完全に間違っていますか?

int numbers[49];

void setup()
{                
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  resetLEDLow();
  genNumbers();
  sortNumbers();
  displayNumber();
  delay(5000);
}

void resetLEDLow()
{
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
  digitalWrite(6, LOW);
  digitalWrite(5, LOW);
}

void genNumbers()
{
  for( int i = 0 ; i < 50 ; i++ )
  {
    numbers[i] = random(256);
  }
}

void sortNumbers()
{
  int sizeOfArray = sizeof(numbers)/sizeof(int);
  int check = 1;
  if( check != 0 )
  {
    check = 0;
    for( int i = 0 ; i < sizeOfArray ; i++ )
    {
      for ( int j = 1 ; j < sizeOfArray ; j++ )
      {
        if( numbers[j-1] > numbers[j] )
        {
          int temp = numbers[j-1];
          numbers[j-1] = numbers[j];
          numbers[j] = temp;
          check++;
        }
      }
    }
    sortNumbers();
  }
}

void displayNumber()
{   
   int i = 12;
   int a = numbers[49];
   Serial.println(numbers[49]);
   while ( a > 0 )
   {
     int num = a % 2;
     a = a / 2;
     if( num == 1 )
     {
       digitalWrite(i, HIGH);
     }else{
       digitalWrite(i, LOW);
     }
     i--;
   }
}

ループ ラウンド カウントが 1 にリセットされるとコードが機能しないことがわかっているため、条件が真になることはありません。それで、何を変更する必要がありますか、それとも私がやっていることは本当に再帰ではありませんか?

これには本当に助けが必要です。私の脳はぐるぐる回っています。

編集:これが新しい再帰を使った私の試みです。問題に関係のないコードを削除しました。

void loop()
{
  int topLevel = 0;
  int currentSort = 0;
  int sizeOfArray = sizeof(numbers)/sizeof(int);
  int numbers[49];
  sortNumbers(topLevel,currentSort,sizeOfArray,numbers);
}

int sortNumbers(p,c,l,numbers)
{
 // Swap if they are in the wrong order
 if( numbers[c-1] > numbers[c] )
 {
   int temp = numbers[c-1];
   numbers[c-1] = numbers[c];
   numbers[c] = temp;
 }
 // If we have finished this level and need to go to next level
 if( c == l )
 {
   c = 0;
   p++;
 }
 // Finished
 if( p == l+1 )
 {
   return numbers;
 }
 // Continue to the next place
 return sortNumbers(p,c+1,l, numbers);
}

Sort50Rec:-1: エラー: 'p' はこのスコープで宣言されていません Sort50Rec:-1: エラー: 'c' はこのスコープで宣言されていません Sort50Rec:-1: エラー: 'l' はこのスコープで宣言されていません Sort50Rec: -1: エラー: 'numbers' はこのスコープで宣言されていません Sort50Rec:-1: エラー: 初期化式リストは複合式として扱われます Sort50Rec.cpp: 関数 'void loop()' 内: Sort50Rec:19: エラー: 'numbers'このスコープで宣言されていません Sort50Rec:21: エラー: 'sortNumbers' は関数として使用できません Sort50Rec.cpp: 関数 'void genNumbers()' 内: Sort50Rec:42: エラー: 'numbers' はこのスコープで宣言されていません Sort50Rec .cpp: グローバル スコープ: Sort50Rec:46: エラー: 'int sortNumbers' の再定義 Sort50Rec:-1: エラー: 'int sortNumbers' は以前にここで定義されていました Sort50Rec:46: エラー: 'p' はこのスコープで宣言されていません Sort50Rec:46: エラー: 'c' はこのスコープで宣言されていません Sort50Rec:46: エラー: 'l' はこのスコープで宣言されていません Sort50Rec:46: エラー: ' numbers' はこのスコープで宣言されていませんでした

その一部は、私が自分の関数に名前を付けている方法であると確信しています.1つの値しか返せないと考えるのは正しいですか? か否か?

編集:新しいエラーが指摘されたエラーを修正しました。

    void loop()
{
  int topLevel = 0;
  int currentSort = 0;
  int numbers [49];
  int sizeOfArray = sizeof(numbers)/sizeof(int);
  numbers = sortNumbers(topLevel,currentSort,sizeOfArray,numbers);
}

int sortNumbers(int p,int c,int l,int numbers)
{
 // Swap if they are in the wrong order
 if( numbers[c-1] > numbers[c] )
 {
   int temp = numbers[c-1];
   numbers[c-1] = numbers[c];
   numbers[c] = temp;
 }
 // If we have finished this level and need to go to next level
 if( c == l )
 {
   c = 0;
   p++;
 }
 // Finished
 if( p == l+1 )
 {
   return numbers;
 }
 // Continue to the next place
 return sortNumbers(p,c+1,l, numbers);
}

Sort50Rec.cpp: 関数 'void loop()' 内: Sort50Rec:19: エラー: 'int*' から 'int' への変換が無効です Sort50Rec:19: エラー: 'int sortNumbers(int, int, int, int)' Sort50Rec:19: エラー: 'int' から 'int [49]' への代入に互換性のない型があります Sort50Rec.cpp: 関数 'void genNumbers()' 内: Sort50Rec:40: エラー: 'numbers' がこのスコープ Sort50Rec.cpp: 関数 'int sortNumbers(int, int, int, int)': Sort50Rec:47: エラー: 無効な型 'int[int]' 配列添字 Sort50Rec:47: エラー: 無効な型 'int[配列添字の int]' Sort50Rec:49: エラー: 配列添字の型 'int[int]' が無効です Sort50Rec:50: エラー: 配列添字の型 'int[int]' が無効です Sort50Rec:50: エラー:無効な型 'int[int]' 配列添字 Sort50Rec:51: エラー: 無効な型 'int[int]' 配列添字 Sort50Rec.cpp: 関数内 'void displayNumber()': Sort50Rec:71: エラー: 'numbers'このスコープで宣言されていませんでした

ありがとう

4

2 に答える 2

2

冗長チェックがあり、無限ループが発生しています。

void sortNumbers()
{
  ...
  int check = 1;
  if( check != 0 )
  {
    ...
    sortNumbers();
  }
}

さて、これは明らかに宿題なので、一般的なアドバイスをします。一般に、再帰を使用して、特定のサイズの問題を小さくします。問題のどの部分が各反復で小さくなっているのかを把握し、各反復をループではなく再帰呼び出しにするだけです(ヒント:これは、サイズやサイズを通知するためにメソッドに値を渡す必要があることを意味します現在の反復の場所)。また、メソッドの最初か、問題のサイズを確認するために再帰する前に、必ず確認してください。


void loop()
{
  int topLevel = 0;
  int currentSort = 0;
  /* You never initialize this - what's supposed to be in it? */
  int numbers [49];
  int sizeOfArray = sizeof(numbers)/sizeof(int);
  /* Two things here: you're passing an array (numbers) in where the 
     sortNumbers() function has it declared as an int;
     and the return value is declared as an int, but you're storing it 
     into an array. */
  numbers = sortNumbers(topLevel,currentSort,sizeOfArray,numbers);
}

/* You're going to have to change this method signature - you're working 
   with arrays, not plain ints. You're changing numbers[] inline, so you 
   don't need to return anything. */
int sortNumbers(int p,int c,int l,int numbers)
{
 /* The first iteration has c = 0, so [c-1] is going to be out-of-bounds. 
    Also, when c = l, [c] will be out of bounds. */
 if( numbers[c-1] > numbers[c] )
 {
   int temp = numbers[c-1];
   numbers[c-1] = numbers[c];
   numbers[c] = temp;
 }
 if( c == l )
 {
   c = 0;
   p++;
 }
 if( p == l+1 )
 {
   return numbers;
 }
 return sortNumbers(p,c+1,l, numbers);
}

これは私が考えていた方法ではありませんが、私が指摘した問題(そしておそらく私が見逃した問題)を修正すればうまくいくはずだと思います。

于 2012-05-21T15:15:42.360 に答える