Я пытаюсь найти степень симметрии строки, но мой вывод становится равным нулю - PullRequest
0 голосов
/ 02 июня 2019

Предполагается, что приведенный ниже код рассчитывает степень симметрии заданной строки, для которой я использовал рекурсию, и мой вывод всегда равен 0 для идеально симметричных букв, таких как AAAA

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

using namespace std;
int count=0;

void sym(int n,string a)
{
    int mid=(n)/2;
    char ch1[20];
    char ch2[20];
    for(int i=0;i<mid;i++)
    ch1[i]=a[i];
    for(int i=mid;i<n;i++)
    ch2[i-mid]=a[i];
    while(mid!=0)
    {
    if(!strcmp(ch1,ch2))
    {
        count++;
        sym(mid,a);
    }
    else
    break;
    }   
}

int main()
{
    int n;
    string a;
    cout<<"Enter the Size of 2^n : ";
    cin>>n;
    cout<<"Enter the String : ";
    cin>>a;
    cout<<a<<endl;
    sym(n,a);
    cout<<count;
    return 0;
}

Ожидаемый результат для AAAA должен быть 2 -> AA-AA, а затем A-A

1 Ответ

0 голосов
/ 02 июня 2019

Вы не инициализируете вектор символа и, следовательно, вероятно, сравниваете много мусора, из-за которого он расходится и составляет 0.

Обратите внимание, что из-за этого он всегда ломает while, иначе он зависнет там, когда вы передаете середину копией и никогда не меняете ее, что делает его всегда больше 0.

Вам лучше заменить циклы for для создания подстрок вызовами substr() и while для if:

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

using namespace std;
int count=0;

void sym(int n,string a)
{
    int mid=(n)/2;
    string ch1 = a.substr(0, mid - 1);
    string ch2 = a.substr(mid, npos);
    if (mid != 0 && ch1.compare(ch2) == 0)
    {
        count++;
        sym(mid, a);
    }   
}

int main()
{
    int n;
    string a;
    cout<<"Enter the Size of 2^n : ";
    cin>>n;
    cout<<"Enter the String : ";
    cin>>a;
    cout<<a<<endl;
    sym(n,a);
    cout<<count;
    return 0;
}
...