簡體   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