c++ - 返回不停止函数,递归函数问题? (编程练习,动态规划,Levenshtein Back-trace)

标签 c++ recursion levenshtein-distance backtrace

printOptimalAlignment 函数运行异常。当函数到达位置 (1,1) 时,goto 和 return 不会退出......它应该结束的地方,没有崩溃并且它停在看似任意的位置 (6,6)... 因为出于某种原因它递增到函数的结尾,即使值 int yL、int xL 没有递增器,(但我不理解为什么它在到达函数结尾时调用自身而没有任何“命中”声明。

完整代码: https://repl.it/@fulloutfool/Edit-Distance

void printOptimalAlignment(int** arr, string y, string x,int yL, int xL){
  int I_weight=1, D_weight=1, R_weight=1;
  bool printinfo_allot = 1,printinfo = 1; 

  if(printinfo_allot){
    cout<<"Location: "<<"("<<xL<<","<<yL<<")"<<"-------------------------------\n";
    cout<<"Same check Letters: "<<x[xL-2]<<","
      <<y[yL-2]<<"("<<(x[xL-2] == y[yL-2])<<")"<<"\n";
    cout<<"LL: "<<"("<<xL-1<<","<<yL<<")"
      <<":"<<arr[yL][xL-1]
      <<":"<<(arr[yL][xL-1]+I_weight)
      <<":"<<(arr[yL][xL])
      <<":"<<(((arr[yL][xL-1]+I_weight) == arr[yL][xL])==1)
      <<":"<<(yL>=1 && xL>=1)<<"\n";
    cout<<"xL state:"<<((&x[xL]))<<":"<<(x[xL-1])<<"\n";
    cout<<"yL state:"<<((&y[yL]))<<":"<<(y[yL-1])<<"\n";
    string tx = &x[xL];
    cout<<x.length()<<","<<(tx.length()+1)<<"\n";
  }

  string tx = &x[xL]; // slopy hotfix
  if(x.length()==(tx.length()+1)){
    cout<<"return functionality not working?-=-=-=-=-=-=-=-=\n";
    cout<<"-> Prep last, current distance = "<<arr[yL][xL] <<"\n";
    return;
    //printOptimalAlignment(arr,y,x,yL-1,xL-1);
    //cant use this goto... but where does it go?
    //goto because_Im_a_terrible_person;
    throw "how?... breaking rules... make it stop";
  }

  if(yL>=1 && xL>=1 && (x[xL-2] == y[yL-2]) == 1){
    if(printinfo){
      cout<<"-> Same (same char), current distance = "<<arr[yL][xL] <<"\n";
    }
    printOptimalAlignment(arr,y,x,yL-1,xL-1);
  }

  if(yL>=1 && xL>=1 && (arr[yL-1][xL-1] == arr[yL][xL])){
    if(printinfo){
      cout<<"-> Swap (same int), current distance = "<<arr[yL][xL] <<"\n";
      if(arr[yL-1][xL-1]==0)cout<<"---this is last---\n";
    }
    printOptimalAlignment(arr,y,x,yL-1,xL-1);
  }

  if(yL>0 && xL>0 && (arr[yL-1][xL]+D_weight == arr[yL][xL])){
    if(printinfo){
      cout<<"-> Delete, current distance = "<<arr[yL][xL]<<"\n";
    }
    printOptimalAlignment(arr,y,x,yL-1,xL);
  }

  //really weird ((yL>1 && xL>1) && (((arr[yL][xL-1]+I_weight) == arr[yL][xL])==1))
  //not true if it is?
  bool seperate = (((arr[yL][xL-1]+I_weight) == arr[yL][xL])==1);
  if(yL>=1 && xL>=1){
    if((((arr[yL][xL-1]+I_weight) == arr[yL][xL])==1) && (true)){
      if(printinfo){
        cout<<"-> Insert, current distance = "<<arr[yL][xL]<<"\n";
        cout<<"Next Location1: "<<"("<<xL-1<<","<<yL<<")"<<"\n";
      }
      printOptimalAlignment(arr,y,x,yL,xL-1);
      return;
      //how does it get here... also return gets ignored... prob another stack issue
      cout<<"insert function broke?????? @ (1,1) ???????????????\n";
      //return;

    }
  }
  return;
  cout<<"END... Hopefully.. if you see this Something went wrong\n";
  because_Im_a_terrible_person:
  cout<<"QUIT\n";
}

最佳答案

我怀疑您的问题是您的函数调用了自身,而您似乎没有考虑到对自身的调用完成后接下来 应该发生什么。所以你到达你说 return 不起作用的完成条件,但它确实......它只是返回到你在上一次调用 printOptimalAlignment,在返回给它的调用者之前它仍然可能做一些事情,等等。您有三个不同的站点,您在其中递归调用 printOptimalAlignment,但后面没有立即返回语句,并且在其中任何一个站点上,代码可能会继续并触发另一个条件 block 。

关于c++ - 返回不停止函数,递归函数问题? (编程练习,动态规划,Levenshtein Back-trace),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346820/

相关文章:

javascript - 索引字典的编辑距离

java - 什么是确定 2 个字符串是否为 "similar enough"的好指标

c++ - 如何找到 QDockWidget 标题栏的高度?

c++ - 部分模板实例化

Python数字组合生成器需要递归

c++ - 防止在递归组合生成中分配内存

vba - VBA 中的编辑距离

c++ - 以这种方式在运行时访问元组的性能成本

c++ - 为什么 long long 值与 8 字节边界对齐?

c++ - 递归反转堆栈