【发布时间】: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