C语言 递归逆变



我为我的大学课程编写了以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
int palindromoR(int i, int f, char *s)
{

if (f - i <= 0) 
return 1;

if (s[i] != s[f]) {
return 0;
} else {
return palindromoR(i+1, f-1, s);
}
}
void palindromo(char *s)
{
int saida = palindromoR(0, strlen(s) - 1, s);
if (saida)
{
printf("eh palindromon");
}
else
{
printf("nao eh palindromon");
}
}
void inversaR(char *str)
{
static int i=0;
int tam = strlen(str) - i;
char temp;

if (tam +1 == 0)
return;
temp = str[tam];
printf ("%c",temp);
i++;
return inversaR (str);

}
void inversa(char *s)
{
inversaR(s);
printf("n");
}
unsigned long stirlingR(unsigned long n, unsigned long k)
{
// implemente essa função recursiva
return 0;
}
void stirling(int n, int k)
{
printf("%lun", stirlingR(n, k));
}
void padraoR(unsigned n)
{

}
void padrao(unsigned n)
{
padraoR(n);
printf("n");
}
int main(int argc, char *argv[])
{
char file_name[MAX], aux[MAX];
FILE *entrada;
int t, a, b;
scanf("%s", file_name);
entrada = fopen(file_name, "r");
if (entrada == NULL)
{
printf("Nao encontrei o arquivo!");
exit(EXIT_FAILURE);
}
fscanf(entrada, "%d", &t);
if (t < 1 || t > 4)
{
printf("Parametros incorretos.n");
printf("Ex:n");
printf("tp01_recursao 1 [para testar palindromo]n");
printf("tp01_recursao 2 [para testar inversa]n");
printf("tp01_recursao 3 [para testar Stirling]n");
printf("tp01_recursao 4 [para testar padrao]n");
}
if (t == 1)
{
printf("nTestando palindromo()nn");
fscanf(entrada, "%s", aux);
while (aux[0] != '.')
{
palindromo(aux);
fscanf(entrada, "%s", aux);
}
}
else if (t == 2)
{
printf("nTestando inversa()nn");
fscanf(entrada, "%s", aux);
while (aux[0] != '.')
{
inversa(aux);
fscanf(entrada, "%s", aux);
}
}
else if (t == 3)
{
printf("nTestando Stirling()nn");
fscanf(entrada, "%d %d", &a, &b);
while (a != -1)
{
stirling(a, b);
fscanf(entrada, "%d %d", &a, &b);
}
}
else if (t == 4)
{
printf("nTestando padrao()nn");
fscanf(entrada, "%d", &a);
while (a != -1)
{
padrao(a);
fscanf(entrada, "%d", &a);
}
}
return 0;
}

我的函数inversaR似乎工作时,我这样尝试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void inversaR(char *str)
{
static int i=0;
int tam = strlen(str) - i;
char temp;

if (tam +1 == 0)
return;
temp = str[tam];
printf ("%c",temp);
i++;
return inversaR (str);

}
void inversa(char *s)
{
inversaR(s);
printf("n");
}
int main (){

char teste[100] = "alucard";
inversa(teste);

return 0;
}

上面的代码给了我答案"dracula"如预期的那样,但是当尝试使用第一个代码时,它将字符串切割为2个字符。它正在读取的归档文件包含以下字符串:

2abgato密涅瓦阿.

我试图使用函数strrev()来改变它,它似乎工作得很好,否则同样的问题一直在我的脑海中肆虐。

我尝试了您的代码,看到了您提到的奇怪的切碎输出。对代码进行了一些调试,使我发现了静态变量的问题。在递归&;inversar &;;函数。每次调用一个不同的字符串后,该值被留下一个来自前一个递归调用集的任意值,该递归调用集要么给出部分字符串,要么根本不给出字符串。

很明显,当最后一个字符被打印出来并且返回到函数调用堆栈时,需要重置这个变量。以下是该函数的重构版本:

void inversaR(char *str)
{
static int i=0;
int tam = strlen(str) - i;
char temp;
//printf("tam: %dn", tam);
if (tam +1 == 0)
{
i = 0;                  /* This needs to be reset when returning up the recursive call stack */
return;
}
temp = str[tam];
printf ("%c",temp);
i++;
return inversaR (str);
}

另外,为了向任何测试这个程序的人澄清,我添加了一个"print ">

printf("File name: ");          /* Added to alert the user to enter a file name */
scanf("%s", file_name);
entrada = fopen(file_name, "r");

重构了这两段代码,并创建了一个包含示例字符串集的文本文件,创建了以下终端输出:

@Vera:~/C_Programs/Console/Dracula/bin/Release$ ./Dracula 
File name: Test.txt
Testando inversa()
ba
otag
avrenim
dracula

所有的字符串似乎都被正确地颠倒了。继续尝试这些程序调整,看看它们是否符合你的项目精神。

最新更新