我遇到了一些麻烦。我们基本上被要求创建一个程序的两个版本,它将对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:错误:'numbers'不是 在此范围内声明Sort50Rec:-1:error:初始化表达式 列表作为复合表达式处理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'不是 在此范围内声明
我确信这部分是我命名我的功能的方式,我认为你只能返回一个值吗?或者不是?
编辑:修正错误指出了新错误。
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)'的参数4 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' 这个范围
由于
答案 0 :(得分: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);
}
这不是我想要做的事情,但我相信一旦你解决了我所指出的问题(可能还有一些我错过了),它应该有效。
答案 1 :(得分:0)
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))