Recursion 递归算法
好吧,这对一些人来说似乎微不足道,但我被卡住了 下面是我应该使用的算法: 这是一个递归算法。假设在一个非递增序列中有n个整数,其中第一个是k。从第一个数字后的前k个数字中减去一个。(如果此类数字少于k,则序列不是图形。)如有必要,将n-1个数字的结果序列(忽略第一个)排序为非递增序列。原始序列是图形化的当且仅当第二个序列是图形化的时。对于停止条件,请注意全零序列是图形化的,而包含负数的序列不是图形化的。(证明这一点并不困难,但我们不会在这里讨论。) 例如: 原始顺序:5,4,3,3,2,1,1 减去1五次:3,2,2,1,0,1 排序:3,2,2,1,1,0 减去1三次:1,1,0,1,0 排序:1,1,1,0,0 减去1一次:0,1,0,0 排序:1,0,0,0 减去1一次:-1,0,0 我们有一个负数,所以原始序列不是图形 这对我来说似乎很简单,但当我尝试执行算法时,我被卡住了 以下是我迄今为止编写的函数:Recursion 递归算法,recursion,Recursion,好吧,这对一些人来说似乎微不足道,但我被卡住了 下面是我应该使用的算法: 这是一个递归算法。假设在一个非递增序列中有n个整数,其中第一个是k。从第一个数字后的前k个数字中减去一个。(如果此类数字少于k,则序列不是图形。)如有必要,将n-1个数字的结果序列(忽略第一个)排序为非递增序列。原始序列是图形化的当且仅当第二个序列是图形化的时。对于停止条件,请注意全零序列是图形化的,而包含负数的序列不是图形化的。(证明这一点并不困难,但我们不会在这里讨论。) 例如: 原始顺序:5,4,3,3,2,1,1
//main
int main ()
{
//local variables
const int MAX = 30;
ifstream in;
ofstream out;
int graph[MAX], size;
bool isGraph;
//open and test file
in.open("input3.txt");
if (!in) {
cout << "Error reading file. Exiting program." << endl;
exit(1);
}
out.open("output3.txt");
while (in >> size) {
for (int i = 0; i < size; i++) {
in >> graph[i];
}
isGraph = isGraphical(graph, 0, size);
if (isGraph) {
out << "Yes\n";
}else
out << "No\n";
}
//close all files
in.close();
out.close();
cin.get();
return 0;
}//end main
bool isGraphical(int degrees[], int start, int end){
bool isIt = false;
int ender;
inSort(degrees, end);
ender = degrees[start] + start + 1;
for(int i = 0; i < end; i++)
cout << degrees[i];
cout << endl;
if (degrees[start] == 0){
if(degrees[end-1] < 0)
return false;
else
return true;
}
else{
for(int i = start + 1; i < ender; i++) {
degrees[i]--;
}
isIt = isGraphical(degrees, start+1, end);
}
return isIt;
}
void inSort(int x[],int length)
{
for(int i = 0; i < length; ++i)
{
int current = x[i];
int j;
for(j = i-1; j >= 0 && current > x[j]; --j)
{
x[j+1] = x[j];
}
x[j+1] = current;
}
}
//main
int main()
{
//局部变量
常数int MAX=30;
如果输入;
流出的液体;
int图[MAX],大小;
布尔图;
//打开并测试文件
in.open(“input3.txt”);
如果(!in){
cout大小){
对于(int i=0;i>图[i];
}
isGraph=isGraphical(图形,0,大小);
if(isGraph){
out您确定ender没有超出end吗?ender的值是可以超出end值的度[start]。
然后在for循环中使用ender
for(int i = start+1; i < ender; i++){ //i guess it should be end here
for(inti=start+1;i
我认为您的插入排序算法不正确。请尝试一种(请注意,这会按照与您想要的相反的顺序进行排序)。此外,您还需要
for(int i = start + 1; i < ender + start + 1; i++) {
for(inti=start+1;i
而不是
for(int i = start+1; i < ender; i++)
for(int i=start+1;i
此外,如评论中所述,您希望检查度[end-1]是否小于0而不是度[end]。好的,我,我将在这里发布您遇到的问题的摘要
插入排序内部循环应该是向后的,而不是向前的。将它设为(i=(j-1);(i>=0)和(key>x[i]);i--
degrees[end]
应该是degrees[end-1]
while(!in.eof())
不会。while(in>>大小)
是一个更好的选择
旁注:不是最后一个
degrees[end-1]
而不是停止状态下的degrees[end]
吗?如果你需要递归算法方面的帮助,你应该首先获得递归算法方面的帮助。我只是从第一个[ender]变量中减去1。我将其添加为for(int I=start+1;I