2017-01-04 3 views
0

Если вход считается ожидаемым, функция cal возвращает false. Но функция cal alalays возвращает true.Почему функция cal всегда возвращает истинное значение?

#include <bits/stdc++.h> 
using namespace std; 

bool cal(string s) 
{ 
    int l=s.size(); 
    if(l==1) 
     return false; 
    int l2=l/2; 
    if(l%2==0) 
    { 
     string s1=s.substr (0,l2); 
     string s2=s.substr(l2,l2); 
     if(s1==s2) 
      return true; 
     cal(s1); 
     cal(s2); 
    } 
    else 
    { 
     string s1=s.substr (0,l2); 
     string s2=s.substr(l2+1,l2); 
     if(s1==s2) 
      return true; 
     cal(s1); 
     cal(s2); 
    } 
} 

int main() 
{ 
    int t; 
    cin>>t; 
    while(t--) 
    { 
     string s; 
     cin>>s; 
     bool a; 
     a=cal(s); 
     if(a==true) 
      cout<<"Yes"<<endl; 
     else 
      cout<<"No"<<endl; 
    } 
} 
+5

Я предполагаю, что ваш компилятор предупредил вас, что не все пути управления возвращаются. – drescherjm

+0

Кстати, поскольку выражение 'cal()' '' if ... else' отличается только одной строкой, это единственная строка, которая фактически должна контролироваться им. См. [Здесь] (http://ideone.com/kQpJtn) для примера того, что вы могли бы сделать. –

ответ

0

В двух из ваших логических путей, вы называете кал (S1) и отбросить значения, а затем вызвать кал (s2) и точно так же игнорировать возвращаемое значение. Таким образом, то, что вы возвращаете, - это то, что вы явно не заказывали; Я ожидаю, что это побочное значение cal (s2).

Что вы намеревались для тех ветвей, где s1! = S2?

Я не уверен, что вы пытаетесь сделать; замедленные имена переменных и отсутствие комментариев оставляют нас гадостью о вашем предполагаемом действии. Почему должен pos (что бы вы ни подразумевали под этим) input return false?

Кроме того, в вашем коде может быть логическая ошибка. Похоже, вы пытаетесь разделить строку пополам; вы собираетесь потерять средний символ строки с нечетной длиной?

string s1=s.substr (0,l2); 
    string s2=s.substr(l2+1,l2); 
+0

Кажется, что существует ошибка в его логике, но дело не в том, что в качестве второго индекса требуется 'l2'. Второй параметр substr() '- это требуемая длина подстроки, и оба' l' и 'l2' должны иметь одинаковый результат. Недостатком является то, что [если строка имеет нечетное количество байтов, средний байт будет проигнорирован] (http://ideone.com/kQpJtn). –

+0

Thanks; неправильный язык; редактирование ... – Prune

+0

Добро пожаловать. Hmm ... by «Когда вход pos», я думаю, что он означает, что вход буквально «pos». Если это «pos», тогда 'cal (s1)' (а также 'cal (s2)', если выпавший средний символ был намерен) будет 'false'; возможно, он намерен для 'cal()' возвращать 'false', если любой из рекурсивных вызовов возвращает' false'? Просто догадаться, я не могу сказать наверняка. –