我写了一个最长的公共子序列代码,并想使用递归打印最长的一个。
如果我把printfbefore 返回,结果将反向打印答案 - >“UAJM”。
所以我把printf后面的返回。
但是,输出为空。我希望它可以按顺序打印字符->“MJAU”。
多谢!
- - - - -更新 - - - - -
哦,我明白了!返回后,它立即退出函数,不再运行任何代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int map[20][20];
int maxlen;
int max(int a,int b)
{
return a>b?a:b;
}
void LCS(char* X,char* Y,int m,int n)
{
if(!m||!n)
return ;
if(X[m-1]==Y[n-1])
{
return LCS(X,Y,m-1,n-1);
printf("%c",X[m-1]);
}
if(map[m-1][n]>map[m][n-1])
return LCS(X,Y,m-1,n);
else
return LCS(X,Y,m,n-1);
}
void LCSlength(char* X,char* Y)
{
int len1=strlen(X),len2=strlen(Y);
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(X[i-1]==Y[j-1])
{
map[i][j]=map[i-1][j-1]+1;
}
else
map[i][j]=max(map[i][j-1],map[i-1][j]);
}
}
}
int main()
{
char *X = "XMJYAUZ", *Y = "MZJAWXU";
int m=strlen(X),n=strlen(Y);
LCSlength(X, Y);
LCS(X, Y, m, n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
dbu*_*ush 10
一旦return遇到语句,函数立即从该点返回。return执行之后没有进一步的语句。
仅仅因为您使用递归并不意味着您需要在递归调用时立即返回。这里你需要的是首先进行递归调用,然后打印,然后返回。
if(X[m-1]==Y[n-1])
{
LCS(X,Y,m-1,n-1);
printf("%c",X[m-1]);
return;
}
if(map[m-1][n]>map[m][n-1])
LCS(X,Y,m-1,n);
else
LCS(X,Y,m,n-1);
Run Code Online (Sandbox Code Playgroud)
另外,请注意,由于函数的返回类型是void您不能在return语句中指定返回值。