【问题标题】:Recursive function finding Palindrome递归函数查找回文
【发布时间】:2016-05-29 19:46:21
【问题描述】:

也许你能告诉我方法,至少我可以开始。我只能使用 C 语言。该任务有非常具体的限制,我不能以任何方式打破它们。任务是:

  • 编写检查字符串是否为回文的递归函数。
  • strlen() 只能在函数中使用一次。
  • 不能使用任何循环或基于循环的函数。
  • 在递归函数中只能使用一个转换。
  • 可以更改字符串,但前提是它会在末尾返回 功能。
  • 函数声明为:int palindrom(char* str);
  • 我开始写了,但没有想法了:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    
    int palindrom(char* str)
    {
        int len = strlen(str);
        if (str[0] != str[len - 1]) return 0;
    
    }
    
    int main(void)
    {
        char string1[] = "ROTATOR";
        char string2[] = "8536358";
        char string3[] = "Palindrome";
        if (palindrom(string1)) printf("%s is Palindrome\n", string1);
        else printf("%s is not Palindrome\n", string1);
        if (palindrom(string2)) printf("%s is Palindrome\n", string2);
        else printf("%s is not Palindrome\n", string2);
        if (palindrom(string3)) printf("%s is Palindrome\n", string3);
        else printf("%s is not Palindrome\n", string3);
        return 0;
    }
    

【问题讨论】:

  • 哇,你很快就遇到了作家的障碍。
  • this SO post 可能重复。
  • 谷歌搜索'C递归函数查找回文',即。您的标题以“C”开头,给出; “大约 92,300 个结果”。
  • 不知道你为什么这么快就责怪别人,但我是这个领域的新手。我看到了那个话题,这不是我需要的东西。我的代码应该回答我写的所有观点。
  • 我建议——一般来说——当你有一个任务有几个限制时,你先解决它没有这些限制,让你自己熟悉任务以及如何解决它.然后你转向限制。大多数代码不是坐下来写的,而是一个开发过程

标签: c recursion palindrome


【解决方案1】:

如何解决的线索在限制中:可以更改字符串,但前提是它会在函数结束时返回。通过打印结果来检查该条件。 p>

#include <stdio.h>
#include <string.h>

int palindrom(char* str)
{
    size_t len = strlen(str);
    int res;
    if(len < 2) {
        return 1;                   // cannot shorten: must be success
    }
    if(str[0] != str[len - 1]) {    // make palindrome test
        return 0;
    }

    str[len - 1] = '\0';            // shorten the string at the back
    res = palindrom(str + 1);       // recurse woth string shortened at the front
    str[len - 1] = str[0];          // replace last char (we know it's the same)
    return res;
}

int main(void)
{
    char string1[] = "ROTATOR";
    char string2[] = "8536358";
    char string3[] = "Palindrome";
    char string4[] = "A";
    char *wrd[] = { "not ", "" };

    printf("%s is %sa Palindrome\n", string1, wrd[ palindrom(string1) ]);
    printf("%s is %sa Palindrome\n", string2, wrd[ palindrom(string2) ]);
    printf("%s is %sa Palindrome\n", string3, wrd[ palindrom(string3) ]);
    printf("%s is %sa Palindrome\n", string4, wrd[ palindrom(string4) ]);

    return 0;
}

程序输出:

ROTATOR is a Palindrome
8536358 is a Palindrome
Palindrome is not a Palindrome
A is a Palindrome

【讨论】:

  • @StanislavRyzhkov 感谢您的投票。我刚刚简化了字符替换,因为我们知道第一个字符 == 最后一个字符。
  • 感谢您的回答!非常!看起来就像我试图做的那样。正如我对 Ravi 所说,我不确定我是否正确理解了调用递归的限制,我是否可以无限次调用或只能调用一次。如果是一次,那么使用递归似乎我太奇怪了。我会和我的讲师谈谈这个。
  • 如果只调用一次,则不是递归。递归函数调用自身,必须有退出条件以防止堆栈溢出。
  • @Weather Vane 您的解决方案是正确的!非常感谢,我错过了我的代码中的最后一个字符切割,所以你的改进了它,并且仅限于字符串上的一个递归循环。
【解决方案2】:

这样的事情会奏效吗?

Something like this will work ?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

bool palindrom_helper(char* str, int first, int last)
{
    if(first >= last)
        return true;
    if (str[first] != str[last]) 
        return false;
    return (palindrom(str, first+1, last-1));

}

bool palindrom(char* str)
{
    return palindrom_helper(str, 0, strlen(str)-1);
}

int main(void)
{
    char string1[] = "ROTATOR";
    char string2[] = "8536358";
    char string3[] = "Palindrome";
    if (palindrom(string1)) printf("%s is Palindrome\n", string1);
    else printf("%s is not Palindrome\n", string1);
    if (palindrom(string2)) printf("%s is Palindrome\n", string2);
    else printf("%s is not Palindrome\n", string2);
    if (palindrom(string3)) printf("%s is Palindrome\n", string3);
    else printf("%s is not Palindrome\n", string3);
    return 0;
}

您应该只使用一次 strlen 函数。所以你不能在递归调用的函数中使用它。

我在这里所做的是将 first 和 last 初始化为 0 和 len-1,然后使用 (first+1, last-1) 进行递归。

如果函数发现甚至一对不匹配的字母,它会返回 false。否则它会一直持续到他们一起到达中心(奇数长度的字符串)或相互交叉(偶数长度的字符串)然后返回 true(因为这意味着他们在他们的路径上没有看到任何不匹配的字母)

另外,我不明白你所说的递归函数中的单次转换是什么意思?

【讨论】:

  • strlen()在函数中只能使用一次。main中有3个
  • 很确定约束是每次回文调用一次 strlen 使用。如果不至少调用 strlen 10 次,就无法检查 10 个字符串是否为回文。
  • 感谢您的工作!但是,正如我所写,我有非常具体的限制,我无法在我的函数中输入任何其他 ints。我可以在没有这些限制的情况下解决任务,但是没有任何想法:(
  • 我们可以定义另一个辅助函数吗?或者这也会损害约束吗?
  • 我可以使用其他函数,但函数没有循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2015-12-02
  • 2011-02-08
相关资源
最近更新 更多