2016-05-29 4 views
-4

Может быть, вы можете сказать мне, как я могу начать, по крайней мере. Я могу использовать только C-язык. Задача имеет очень специфические ограничения, и я никоим образом не могу их нарушить. Задача такова:Рекурсивный поиск функции Palindrome

  • Запись рекурсивной функции, которая проверяет, является ли строка Палиндром.
  • Может использовать 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; 
    } 
    
+2

Ого, вы получили блок писателя быстро. – totoro

+3

Возможный дубликат [this SO post] (http://stackoverflow.com/questions/16062723/test-for-palindrome-using-a-recursive-function-in-c). – user3078414

+0

Googling 'C Рекурсивная функция нахождения палиндрома', т.е. ваш заголовок, добавленный с 'C', дает; «Около 92 300 результатов». –

ответ

1

Ключ к решению проблемы находится в ограничении: Может изменить строку, но только если она вернется в конце функции. Это условие проверяется путем печати результата.

#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 
+0

@СтаниславРыжков благодарит вас за ваш голос. Я просто упростил замену chararcter, поскольку мы знаем первый char == last char. –

+0

Спасибо за ваш ответ! Очень! Это похоже на то, как я пытался это сделать. Как я сказал Рави, я не уверен, правильно ли я понял ограничение обращения к рекурсии, если я могу назвать неограниченное время или только один раз. Если это когда-то, мне кажется, слишком странно использовать рекурсию. Я поговорю с моим преподавателем об этом. –

+0

Если вы звоните только один раз, это не рекурсия. Рекурсивная функция вызывает себя, а ** должна ** иметь условие выхода для предотвращения переполнения стека. –

0

Что-то, как это будет работать?

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 только один раз. поэтому вы не можете использовать его внутри функции, которая называется рекурсивно.

то, что я сделал здесь, это инициализировать сначала и последним до 0 и len-1, а затем перезаписать (первый + 1, последний-1).

Если функция находит хотя бы одну пару разблокирующих букв, она вернет false. иначе он будет продолжаться до тех пор, пока они не достигнут центра вместе (строка с нечетной длиной) или не пересекут друг друга (даже длина строки), а затем вернутся к истине (потому что это означало бы, что они не видели на своем пути какой-либо развязывающей буквы)

Кроме того, я не понимаю, что вы подразумеваете под одним переходом в рекурсивной функции?

+0

* Можно использовать 'strlen()' только один раз в функции.* Есть 3 в 'main' –

+0

, что уверенность в том, что ограничение - это одно использование strlen на вызов palindrom(). вы не можете проверить, являются ли 10 строк палиндромами без посыльного strlen 10 раз. –

+0

Спасибо за вашу работу! Но, как я писал, у меня очень специфические ограничения, я не могу получить никаких других 'int' для ввода в мою функцию. Я могу решить задачу без этих ограничений, но с ней понятия не имею :( –

 Смежные вопросы

  • Нет связанных вопросов^_^