【问题标题】:Recursive Bubble Sort递归冒泡排序
【发布时间】:2012-05-28 01:28:36
【问题描述】:

我遇到了一些麻烦。我们基本上被要求创建一个程序的两个版本,对一个包含 50 个项目的数组进行排序,然后在 LED 中显示最大的数字。我已经使用基本的冒泡排序让它工作并显示。我的问题是当我必须使用递归来做到这一点时。不幸的是,我对递归的了解非常有限,因为我错过了关于它的讲座 -.- 他也没有将笔记放到网上。我有一个很长的谷歌但仍然无法理解它。所以我问了几件事。首先,有人可以使用 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: error: 'numbers' was not 在此范围内声明 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: error: 'numbers' was not 在这个范围内声明

我确信部分原因是我命名函数的方式,我是否认为你只能返回一个值?还是不行?

编辑:修正错误指出新错误。

    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的参数4: 错误:将“int”分配给“int [49]”时的类型不兼容 Sort50Rec.cpp:在函数'void genNumbers()'中:Sort50Rec:40:错误: 'numbers' 未在此范围内声明 Sort50Rec.cpp:在函数中 'int sortNumbers(int,int,int,int)':Sort50Rec:47:错误:无效 数组下标 Sort50Rec:47 的类型“int [int]”:错误:无效 数组下标 Sort50Rec:49 的类型“int [int]”:错误:无效 数组下标 Sort50Rec:50 的类型“int [int]”:错误:无效 数组下标 Sort50Rec:50 的类型“int [int]”:错误:无效 数组下标 Sort50Rec:51 的类型“int [int]”:错误:无效 数组下标Sort50Rec.cpp的类型'int [int]':在函数'void displayNumber()': Sort50Rec:71: 错误: 'numbers' 未在 这个范围

谢谢

【问题讨论】:

  • @OliCharlesworth 我现在来看看。谢谢
  • @OliCharlesworth 我已经看过了。但是,我仍然不确定它是如何工作的。你介意透露一下吗?
  • 你在函数声明int sortNumbers(p,c,l,numbers)中没有说变量(p,c,l,numbers)是什么类型的
  • @forsvarir 哎呀,感谢您指出这一点。排序虽然我有一个新问题,但现在将编辑和处理它

标签: c recursion arduino bubble-sort


【解决方案1】:

您有一个导致无限循环的冗余检查。

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);
}

这不是我的想法,但我相信一旦你解决了我指出的问题(可能还有一些我错过了),它应该会起作用。

【讨论】:

  • 嗨@Kevin 编辑-。我想我现在明白你的意思了。如果我用我的 go 编辑主要帖子,你介意看一下吗?
  • @Kyle93 如果它有效,请将其发布在代码审查上(确保将其表述为符合their faq,如果它存在特定问题(例如段错误),请在此处发布另一个问题。如果只是还不太对,在此处添加。无论哪种方式,发布它的链接,我会看看。
  • 干杯 @Kevin 它还没有完全工作。我遇到了未在范围内声明的变量的问题。然而,arduino 对错误没有太大帮助。我现在将编辑帖子以包含我的 go 和错误。谢谢
【解决方案2】:
def bubbleSort(myArray, lenArray):

    if lenArray==1:
        return myArray

    else:
        for i in range(len(myArray)-1):
            if (myArray[i]>myArray[i+1]):
                myArray[i], myArray[i+1] = myArray[i+1], myArray[i]
        return bubbleSort(myArray, lenArray-1)

myArray= [2,3,56,7]
lenArray= len(myArray)
print(bubbleSort(myArray, lenArray)) 

【讨论】:

  • 欢迎来到 SO,也许你的答案是正确的,但总是用至少几句话来解释你的答案。
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 2021-06-22
  • 2013-12-02
  • 2021-03-24
  • 2011-12-09
  • 2013-11-29
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多