Recursion 递归算法

Recursion 递归算法,recursion,Recursion,好吧,这对一些人来说似乎微不足道,但我被卡住了 下面是我应该使用的算法: 这是一个递归算法。假设在一个非递增序列中有n个整数,其中第一个是k。从第一个数字后的前k个数字中减去一个。(如果此类数字少于k,则序列不是图形。)如有必要,将n-1个数字的结果序列(忽略第一个)排序为非递增序列。原始序列是图形化的当且仅当第二个序列是图形化的时。对于停止条件,请注意全零序列是图形化的,而包含负数的序列不是图形化的。(证明这一点并不困难,但我们不会在这里讨论。) 例如: 原始顺序:5,4,3,3,2,1,1

好吧,这对一些人来说似乎微不足道,但我被卡住了

下面是我应该使用的算法:

这是一个递归算法。假设在一个非递增序列中有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

我们有一个负数,所以原始序列不是图形

这对我来说似乎很简单,但当我尝试执行算法时,我被卡住了

以下是我迄今为止编写的函数:

//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