繁体   English   中英

递归反相

[英]Recursive inverting

我为我的大学课程制作了这段代码:

#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 palindromo\n");
    }
    else
    {
        printf("nao eh palindromo\n");
    }
}

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("%lu\n", 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()\n\n");
        fscanf(entrada, "%s", aux);
        while (aux[0] != '.')
        {
            palindromo(aux);
            fscanf(entrada, "%s", aux);
        }
    }
    else if (t == 2)
    {
        printf("\nTestando inversa()\n\n");
        fscanf(entrada, "%s", aux);
        while (aux[0] != '.')
        {
            inversa(aux);
            fscanf(entrada, "%s", aux);
        }
    }

    else if (t == 3)
    {
        printf("\nTestando Stirling()\n\n");
        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()\n\n");

        fscanf(entrada, "%d", &a);
        while (a != -1)
        {
            padrao(a);
            fscanf(entrada, "%d", &a);
        }
    }

    return 0;
}

当我这样尝试时,我的 function 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 个字符。 它正在读取的档案包含以下字符串:

2 ab gato minerva alucard。

我尝试使用 function strrev() 碰碰运气,它似乎工作得很好,否则同样的问题一直困扰着我。

我尝试了你的代码,看到了你提到的古怪的 output。 对代码进行一些调试导致我遇到了你的 static 变量的问题,递归“inversaR”function 中的“i”。每次调用不同的字符串后,该值将保留前一个递归调用集中的任意值给出了部分字符串或根本没有字符串。

很明显,当打印出最后一个字符并且正在返回 function 调用堆栈时,需要重置此变量。 以下是 function 的重构版本。

void inversaR(char *str)
{
    static int i=0;
    int tam = strlen(str) - i;
    char temp;

    //printf("tam: %d\n", 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);

}

此外,为了向测试该程序的任何人澄清,我在提示输入文件名之前添加了一个“printf”语句,以便清楚地知道需要输入什么。

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

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

@Vera:~/C_Programs/Console/Dracula/bin/Release$ ./Dracula 
File name: Test.txt

Testando inversa()

ba
otag
avrenim
dracula

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM