Recursive function in python does not call itself out












3















The problem is formulated as follows:




Write a recursive function that, given a string, checks if the string
is formed by two halves equal to each other (i.e. s = s1 + s2, with s1
= s2), imposing the constraint that the equality operator == can only be applied to strings of length ≤1. If the length of the string is
odd, return an error.




I wrote this code in Python 2.7 that is correct (it gives me the right answer every time) but does not enter that recursive loop at all. So can I omit that call here?



def recursiveHalfString(s):
#@param s: string
#@return bool

if (len(s))%2==0: #verify if the rest of the division by 2 = 0 (even number)

if len(s)<=1: # case in which I can use the == operator
if s[0]==s[1]:
return True
else:
return False

if len(s)>1:
if s[0:len(s)/2] != s[len(s)/2:len(s)]: # here I used != instead of ==
if s!=0:
return False
else:
return recursiveHalfString(s[0:(len(s)/2)-1]+s[(len(s)/2)+1:len(s)]) # broken call
return True

else:
return "Error: odd string"




The expected results are True if the string is like "abbaabba"
or False when it's like anything else not similat to the pattern ("wordword")










share|improve this question




















  • 1





    If == is off limits for string length >1, I would assume != is also not allowed. It's essentially not ==.

    – Tomothy32
    Jan 2 at 21:01








  • 1





    Using the != operator on strings longer than one character is pretty obviously against the spirit of the task - you could just do not (x != y) instead of x == y anywhere you want to use ==.

    – user2357112
    Jan 2 at 21:07






  • 1





    if s!=0: is always true since s is a string. So you can never end up in the else part.

    – schwobaseggl
    Jan 2 at 21:07













  • Also, s is a string. It'll never equal 0. 0 isn't a string.

    – user2357112
    Jan 2 at 21:07











  • Is 'abcabc' symmetrical by the constraints or do all the nested half strings themselves have to be symmetrical?

    – schwobaseggl
    Jan 2 at 21:09


















3















The problem is formulated as follows:




Write a recursive function that, given a string, checks if the string
is formed by two halves equal to each other (i.e. s = s1 + s2, with s1
= s2), imposing the constraint that the equality operator == can only be applied to strings of length ≤1. If the length of the string is
odd, return an error.




I wrote this code in Python 2.7 that is correct (it gives me the right answer every time) but does not enter that recursive loop at all. So can I omit that call here?



def recursiveHalfString(s):
#@param s: string
#@return bool

if (len(s))%2==0: #verify if the rest of the division by 2 = 0 (even number)

if len(s)<=1: # case in which I can use the == operator
if s[0]==s[1]:
return True
else:
return False

if len(s)>1:
if s[0:len(s)/2] != s[len(s)/2:len(s)]: # here I used != instead of ==
if s!=0:
return False
else:
return recursiveHalfString(s[0:(len(s)/2)-1]+s[(len(s)/2)+1:len(s)]) # broken call
return True

else:
return "Error: odd string"




The expected results are True if the string is like "abbaabba"
or False when it's like anything else not similat to the pattern ("wordword")










share|improve this question




















  • 1





    If == is off limits for string length >1, I would assume != is also not allowed. It's essentially not ==.

    – Tomothy32
    Jan 2 at 21:01








  • 1





    Using the != operator on strings longer than one character is pretty obviously against the spirit of the task - you could just do not (x != y) instead of x == y anywhere you want to use ==.

    – user2357112
    Jan 2 at 21:07






  • 1





    if s!=0: is always true since s is a string. So you can never end up in the else part.

    – schwobaseggl
    Jan 2 at 21:07













  • Also, s is a string. It'll never equal 0. 0 isn't a string.

    – user2357112
    Jan 2 at 21:07











  • Is 'abcabc' symmetrical by the constraints or do all the nested half strings themselves have to be symmetrical?

    – schwobaseggl
    Jan 2 at 21:09
















3












3








3


1






The problem is formulated as follows:




Write a recursive function that, given a string, checks if the string
is formed by two halves equal to each other (i.e. s = s1 + s2, with s1
= s2), imposing the constraint that the equality operator == can only be applied to strings of length ≤1. If the length of the string is
odd, return an error.




I wrote this code in Python 2.7 that is correct (it gives me the right answer every time) but does not enter that recursive loop at all. So can I omit that call here?



def recursiveHalfString(s):
#@param s: string
#@return bool

if (len(s))%2==0: #verify if the rest of the division by 2 = 0 (even number)

if len(s)<=1: # case in which I can use the == operator
if s[0]==s[1]:
return True
else:
return False

if len(s)>1:
if s[0:len(s)/2] != s[len(s)/2:len(s)]: # here I used != instead of ==
if s!=0:
return False
else:
return recursiveHalfString(s[0:(len(s)/2)-1]+s[(len(s)/2)+1:len(s)]) # broken call
return True

else:
return "Error: odd string"




The expected results are True if the string is like "abbaabba"
or False when it's like anything else not similat to the pattern ("wordword")










share|improve this question
















The problem is formulated as follows:




Write a recursive function that, given a string, checks if the string
is formed by two halves equal to each other (i.e. s = s1 + s2, with s1
= s2), imposing the constraint that the equality operator == can only be applied to strings of length ≤1. If the length of the string is
odd, return an error.




I wrote this code in Python 2.7 that is correct (it gives me the right answer every time) but does not enter that recursive loop at all. So can I omit that call here?



def recursiveHalfString(s):
#@param s: string
#@return bool

if (len(s))%2==0: #verify if the rest of the division by 2 = 0 (even number)

if len(s)<=1: # case in which I can use the == operator
if s[0]==s[1]:
return True
else:
return False

if len(s)>1:
if s[0:len(s)/2] != s[len(s)/2:len(s)]: # here I used != instead of ==
if s!=0:
return False
else:
return recursiveHalfString(s[0:(len(s)/2)-1]+s[(len(s)/2)+1:len(s)]) # broken call
return True

else:
return "Error: odd string"




The expected results are True if the string is like "abbaabba"
or False when it's like anything else not similat to the pattern ("wordword")







python python-2.7






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 2 at 21:32







Marcus S.

















asked Jan 2 at 20:58









Marcus S.Marcus S.

205




205








  • 1





    If == is off limits for string length >1, I would assume != is also not allowed. It's essentially not ==.

    – Tomothy32
    Jan 2 at 21:01








  • 1





    Using the != operator on strings longer than one character is pretty obviously against the spirit of the task - you could just do not (x != y) instead of x == y anywhere you want to use ==.

    – user2357112
    Jan 2 at 21:07






  • 1





    if s!=0: is always true since s is a string. So you can never end up in the else part.

    – schwobaseggl
    Jan 2 at 21:07













  • Also, s is a string. It'll never equal 0. 0 isn't a string.

    – user2357112
    Jan 2 at 21:07











  • Is 'abcabc' symmetrical by the constraints or do all the nested half strings themselves have to be symmetrical?

    – schwobaseggl
    Jan 2 at 21:09
















  • 1





    If == is off limits for string length >1, I would assume != is also not allowed. It's essentially not ==.

    – Tomothy32
    Jan 2 at 21:01








  • 1





    Using the != operator on strings longer than one character is pretty obviously against the spirit of the task - you could just do not (x != y) instead of x == y anywhere you want to use ==.

    – user2357112
    Jan 2 at 21:07






  • 1





    if s!=0: is always true since s is a string. So you can never end up in the else part.

    – schwobaseggl
    Jan 2 at 21:07













  • Also, s is a string. It'll never equal 0. 0 isn't a string.

    – user2357112
    Jan 2 at 21:07











  • Is 'abcabc' symmetrical by the constraints or do all the nested half strings themselves have to be symmetrical?

    – schwobaseggl
    Jan 2 at 21:09










1




1





If == is off limits for string length >1, I would assume != is also not allowed. It's essentially not ==.

– Tomothy32
Jan 2 at 21:01







If == is off limits for string length >1, I would assume != is also not allowed. It's essentially not ==.

– Tomothy32
Jan 2 at 21:01






1




1





Using the != operator on strings longer than one character is pretty obviously against the spirit of the task - you could just do not (x != y) instead of x == y anywhere you want to use ==.

– user2357112
Jan 2 at 21:07





Using the != operator on strings longer than one character is pretty obviously against the spirit of the task - you could just do not (x != y) instead of x == y anywhere you want to use ==.

– user2357112
Jan 2 at 21:07




1




1





if s!=0: is always true since s is a string. So you can never end up in the else part.

– schwobaseggl
Jan 2 at 21:07







if s!=0: is always true since s is a string. So you can never end up in the else part.

– schwobaseggl
Jan 2 at 21:07















Also, s is a string. It'll never equal 0. 0 isn't a string.

– user2357112
Jan 2 at 21:07





Also, s is a string. It'll never equal 0. 0 isn't a string.

– user2357112
Jan 2 at 21:07













Is 'abcabc' symmetrical by the constraints or do all the nested half strings themselves have to be symmetrical?

– schwobaseggl
Jan 2 at 21:09







Is 'abcabc' symmetrical by the constraints or do all the nested half strings themselves have to be symmetrical?

– schwobaseggl
Jan 2 at 21:09














3 Answers
3






active

oldest

votes


















1














Here is another recursive solution. A good rule of thumb when taking a recursive approach is to first think about your base case.



def recursiveHalfString(s):
# base case, if string is empty
if s == '':
return True

if (len(s))%2==0:
if s[0] != s[(len(s)/2)]:
return False
else:
left = s[1:len(s)/2] # the left half of the string without first char
right = s[(len(s)/2)+1: len(s)] # the right half without first char
return recursiveHalfString(left + right)
else:
return "Error: odd string"

print(recursiveHalfString('abbaabba')) # True
print(recursiveHalfString('fail')) # False
print(recursiveHalfString('oddstring')) # Error: odd string


This function will split the string into two halves, compare the first characters and recursively call itself with the two halves concatenated together without the leading characters.



However like stated in another answer, recursion is not necessarily an efficient solution in this case. This approach creates a lot of new strings and is in no way an optimal way to do this. It is for demonstration purposes only.






share|improve this answer

































    6














    This is a much simplified recursive version that actually uses the single char comparison to reduce the problem size:



    def rhs(s):
    half, rest = divmod(len(s), 2)
    if rest: # odd length
    raise ValueError # return 'error'
    if half == 0: # simplest base case: empty string
    return True
    return s[0] == s[half] and rhs(s[1:half] + s[half+1:])


    It has to be said though that, algorithmically, this problem does not lend itself well to a recursive approach, given the constraints.






    share|improve this answer

































      1














      Another recursive solution that doesn't involve creating a bunch of new strings might look like:



      def recursiveHalfString(s, offset=0):
      half, odd = divmod(len(s), 2)
      assert(not odd)
      if not s or offset > half:
      return True
      if s[offset] != s[half + offset]:
      return False
      return recursiveHalfString(s, offset + 1)


      However, as @schwobaseggl suggested, a recursive approach here is a bit clunkier than a simple iterative approach:



      def recursiveHalfString(s, offset=0):
      half, odd = divmod(len(s), 2)
      assert(not odd)
      for offset in range(half):
      if s[offset] != s[half + offset]:
      return False
      return True





      share|improve this answer


























        Your Answer






        StackExchange.ifUsing("editor", function () {
        StackExchange.using("externalEditor", function () {
        StackExchange.using("snippets", function () {
        StackExchange.snippets.init();
        });
        });
        }, "code-snippets");

        StackExchange.ready(function() {
        var channelOptions = {
        tags: "".split(" "),
        id: "1"
        };
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function() {
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled) {
        StackExchange.using("snippets", function() {
        createEditor();
        });
        }
        else {
        createEditor();
        }
        });

        function createEditor() {
        StackExchange.prepareEditor({
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: true,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: 10,
        bindNavPrevention: true,
        postfix: "",
        imageUploader: {
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        },
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        });


        }
        });














        draft saved

        draft discarded


















        StackExchange.ready(
        function () {
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54013093%2frecursive-function-in-python-does-not-call-itself-out%23new-answer', 'question_page');
        }
        );

        Post as a guest















        Required, but never shown

























        3 Answers
        3






        active

        oldest

        votes








        3 Answers
        3






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        1














        Here is another recursive solution. A good rule of thumb when taking a recursive approach is to first think about your base case.



        def recursiveHalfString(s):
        # base case, if string is empty
        if s == '':
        return True

        if (len(s))%2==0:
        if s[0] != s[(len(s)/2)]:
        return False
        else:
        left = s[1:len(s)/2] # the left half of the string without first char
        right = s[(len(s)/2)+1: len(s)] # the right half without first char
        return recursiveHalfString(left + right)
        else:
        return "Error: odd string"

        print(recursiveHalfString('abbaabba')) # True
        print(recursiveHalfString('fail')) # False
        print(recursiveHalfString('oddstring')) # Error: odd string


        This function will split the string into two halves, compare the first characters and recursively call itself with the two halves concatenated together without the leading characters.



        However like stated in another answer, recursion is not necessarily an efficient solution in this case. This approach creates a lot of new strings and is in no way an optimal way to do this. It is for demonstration purposes only.






        share|improve this answer






























          1














          Here is another recursive solution. A good rule of thumb when taking a recursive approach is to first think about your base case.



          def recursiveHalfString(s):
          # base case, if string is empty
          if s == '':
          return True

          if (len(s))%2==0:
          if s[0] != s[(len(s)/2)]:
          return False
          else:
          left = s[1:len(s)/2] # the left half of the string without first char
          right = s[(len(s)/2)+1: len(s)] # the right half without first char
          return recursiveHalfString(left + right)
          else:
          return "Error: odd string"

          print(recursiveHalfString('abbaabba')) # True
          print(recursiveHalfString('fail')) # False
          print(recursiveHalfString('oddstring')) # Error: odd string


          This function will split the string into two halves, compare the first characters and recursively call itself with the two halves concatenated together without the leading characters.



          However like stated in another answer, recursion is not necessarily an efficient solution in this case. This approach creates a lot of new strings and is in no way an optimal way to do this. It is for demonstration purposes only.






          share|improve this answer




























            1












            1








            1







            Here is another recursive solution. A good rule of thumb when taking a recursive approach is to first think about your base case.



            def recursiveHalfString(s):
            # base case, if string is empty
            if s == '':
            return True

            if (len(s))%2==0:
            if s[0] != s[(len(s)/2)]:
            return False
            else:
            left = s[1:len(s)/2] # the left half of the string without first char
            right = s[(len(s)/2)+1: len(s)] # the right half without first char
            return recursiveHalfString(left + right)
            else:
            return "Error: odd string"

            print(recursiveHalfString('abbaabba')) # True
            print(recursiveHalfString('fail')) # False
            print(recursiveHalfString('oddstring')) # Error: odd string


            This function will split the string into two halves, compare the first characters and recursively call itself with the two halves concatenated together without the leading characters.



            However like stated in another answer, recursion is not necessarily an efficient solution in this case. This approach creates a lot of new strings and is in no way an optimal way to do this. It is for demonstration purposes only.






            share|improve this answer















            Here is another recursive solution. A good rule of thumb when taking a recursive approach is to first think about your base case.



            def recursiveHalfString(s):
            # base case, if string is empty
            if s == '':
            return True

            if (len(s))%2==0:
            if s[0] != s[(len(s)/2)]:
            return False
            else:
            left = s[1:len(s)/2] # the left half of the string without first char
            right = s[(len(s)/2)+1: len(s)] # the right half without first char
            return recursiveHalfString(left + right)
            else:
            return "Error: odd string"

            print(recursiveHalfString('abbaabba')) # True
            print(recursiveHalfString('fail')) # False
            print(recursiveHalfString('oddstring')) # Error: odd string


            This function will split the string into two halves, compare the first characters and recursively call itself with the two halves concatenated together without the leading characters.



            However like stated in another answer, recursion is not necessarily an efficient solution in this case. This approach creates a lot of new strings and is in no way an optimal way to do this. It is for demonstration purposes only.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Jan 2 at 21:51

























            answered Jan 2 at 21:41









            Kevin WelchKevin Welch

            650314




            650314

























                6














                This is a much simplified recursive version that actually uses the single char comparison to reduce the problem size:



                def rhs(s):
                half, rest = divmod(len(s), 2)
                if rest: # odd length
                raise ValueError # return 'error'
                if half == 0: # simplest base case: empty string
                return True
                return s[0] == s[half] and rhs(s[1:half] + s[half+1:])


                It has to be said though that, algorithmically, this problem does not lend itself well to a recursive approach, given the constraints.






                share|improve this answer






























                  6














                  This is a much simplified recursive version that actually uses the single char comparison to reduce the problem size:



                  def rhs(s):
                  half, rest = divmod(len(s), 2)
                  if rest: # odd length
                  raise ValueError # return 'error'
                  if half == 0: # simplest base case: empty string
                  return True
                  return s[0] == s[half] and rhs(s[1:half] + s[half+1:])


                  It has to be said though that, algorithmically, this problem does not lend itself well to a recursive approach, given the constraints.






                  share|improve this answer




























                    6












                    6








                    6







                    This is a much simplified recursive version that actually uses the single char comparison to reduce the problem size:



                    def rhs(s):
                    half, rest = divmod(len(s), 2)
                    if rest: # odd length
                    raise ValueError # return 'error'
                    if half == 0: # simplest base case: empty string
                    return True
                    return s[0] == s[half] and rhs(s[1:half] + s[half+1:])


                    It has to be said though that, algorithmically, this problem does not lend itself well to a recursive approach, given the constraints.






                    share|improve this answer















                    This is a much simplified recursive version that actually uses the single char comparison to reduce the problem size:



                    def rhs(s):
                    half, rest = divmod(len(s), 2)
                    if rest: # odd length
                    raise ValueError # return 'error'
                    if half == 0: # simplest base case: empty string
                    return True
                    return s[0] == s[half] and rhs(s[1:half] + s[half+1:])


                    It has to be said though that, algorithmically, this problem does not lend itself well to a recursive approach, given the constraints.







                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited Jan 2 at 21:25

























                    answered Jan 2 at 21:18









                    schwobasegglschwobaseggl

                    37.5k32443




                    37.5k32443























                        1














                        Another recursive solution that doesn't involve creating a bunch of new strings might look like:



                        def recursiveHalfString(s, offset=0):
                        half, odd = divmod(len(s), 2)
                        assert(not odd)
                        if not s or offset > half:
                        return True
                        if s[offset] != s[half + offset]:
                        return False
                        return recursiveHalfString(s, offset + 1)


                        However, as @schwobaseggl suggested, a recursive approach here is a bit clunkier than a simple iterative approach:



                        def recursiveHalfString(s, offset=0):
                        half, odd = divmod(len(s), 2)
                        assert(not odd)
                        for offset in range(half):
                        if s[offset] != s[half + offset]:
                        return False
                        return True





                        share|improve this answer






























                          1














                          Another recursive solution that doesn't involve creating a bunch of new strings might look like:



                          def recursiveHalfString(s, offset=0):
                          half, odd = divmod(len(s), 2)
                          assert(not odd)
                          if not s or offset > half:
                          return True
                          if s[offset] != s[half + offset]:
                          return False
                          return recursiveHalfString(s, offset + 1)


                          However, as @schwobaseggl suggested, a recursive approach here is a bit clunkier than a simple iterative approach:



                          def recursiveHalfString(s, offset=0):
                          half, odd = divmod(len(s), 2)
                          assert(not odd)
                          for offset in range(half):
                          if s[offset] != s[half + offset]:
                          return False
                          return True





                          share|improve this answer




























                            1












                            1








                            1







                            Another recursive solution that doesn't involve creating a bunch of new strings might look like:



                            def recursiveHalfString(s, offset=0):
                            half, odd = divmod(len(s), 2)
                            assert(not odd)
                            if not s or offset > half:
                            return True
                            if s[offset] != s[half + offset]:
                            return False
                            return recursiveHalfString(s, offset + 1)


                            However, as @schwobaseggl suggested, a recursive approach here is a bit clunkier than a simple iterative approach:



                            def recursiveHalfString(s, offset=0):
                            half, odd = divmod(len(s), 2)
                            assert(not odd)
                            for offset in range(half):
                            if s[offset] != s[half + offset]:
                            return False
                            return True





                            share|improve this answer















                            Another recursive solution that doesn't involve creating a bunch of new strings might look like:



                            def recursiveHalfString(s, offset=0):
                            half, odd = divmod(len(s), 2)
                            assert(not odd)
                            if not s or offset > half:
                            return True
                            if s[offset] != s[half + offset]:
                            return False
                            return recursiveHalfString(s, offset + 1)


                            However, as @schwobaseggl suggested, a recursive approach here is a bit clunkier than a simple iterative approach:



                            def recursiveHalfString(s, offset=0):
                            half, odd = divmod(len(s), 2)
                            assert(not odd)
                            for offset in range(half):
                            if s[offset] != s[half + offset]:
                            return False
                            return True






                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Jan 2 at 22:01

























                            answered Jan 2 at 21:50









                            AlbertAlbert

                            915




                            915






























                                draft saved

                                draft discarded




















































                                Thanks for contributing an answer to Stack Overflow!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid



                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.


                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function () {
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54013093%2frecursive-function-in-python-does-not-call-itself-out%23new-answer', 'question_page');
                                }
                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

                                Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

                                A Topological Invariant for $pi_3(U(n))$