0

Program performs binomial expansion, with specific input it performs line 126 referring to another function. That function calculates the "final_statement" and when the exponent == 1 it returns (line 90) "final_statement". I have added a print function right above which prints out "final_statement" just fine, but for some reason the return function right below does not return "final_statement"

It seems that no matter what i do, the return function refuses to return the value even though it clearly is valid and the return function triggers

# https://www.codewars.com/kata/540d0fdd3b6532e5c3000b5b/train/python
def calculate(newest_equation, exponent, original_parantes, letter):
    newing_equation = []
    newer_equation = []
    for i in newest_equation:
        newer_equation.append(i)
    for i in newer_equation:
        if letter in i:
            letter_index_1 = i.index(letter)
            curr_int = int(i[:letter_index_1])
            for z in original_parantes:
                if letter in z:
                    letter_index = z.index(letter)
                    curr_2_int = int(z[:letter_index])
                    if i[-1] != letter and i[letter_index + 1] != "2":
                        new_add = letter + str(int(i[letter_index_1 + 1:]) + 1)
                    else:
                        new_add = letter + "2"
                else:
                    curr_2_int = int(z)
                    new_add = i[letter_index_1:]
                product = str(curr_int * curr_2_int)
                product += new_add
                newing_equation.append([product])
        else:
            curr_int = int(i)
            for z in original_parantes:
                if letter in z:
                    letter_index = z.index(letter)
                    curr_2_int = int(z[:letter_index])
                    new_add = z[letter_index:]
                else:
                    curr_2_int = int(z)
                    new_add = ""
                product = str(curr_int * curr_2_int)
                product += new_add
                newing_equation.append([product])
    sending_values = []
    for i in newing_equation:
        for z in i:
            if z != "":
                sending_values.append(str(z))
    exponent -= 1
    final_statement = ""
    if exponent == 1:
        taken_exponents = []
        go = True
        for q in range(0, 5):
            best_exponent = 0
            curr_exponent = 0
            curr_sum = 0
            for i in sending_values:
                if letter in i:
                    if i[-1] != letter:
                        if int(i[i.index(letter) + 1:]) not in taken_exponents:
                            curr_exponent = i[i.index(letter) + 1:]
                    if i[-1] == letter:
                        if 1 not in taken_exponents:
                            curr_exponent = 1
                else:
                    if 0 in taken_exponents:
                        go = False
                    curr_exponent = 0
                if int(curr_exponent) >= int(best_exponent):
                    best_exponent = curr_exponent
            taken_exponents.append(int(best_exponent))
            if go:
                for i in sending_values:
                    if letter not in i:
                        if best_exponent == 0:
                            curr_sum += int(i)
                    if letter in i:
                        if i[-1] != letter:
                            if int(i[i.index(letter) + 1:]) == int(best_exponent):
                                curr_sum += int(i[:i.index(letter)])
                        elif i[-1] == letter:
                            if int(best_exponent) == 1:
                                curr_sum += int(i[:i.index(letter)])
                if str(curr_sum) != "" and int(best_exponent) >= 1 and str(curr_sum)[0] == "-":
                    final_statement = final_statement[:-1]
                if str(curr_sum) == "1" and int(best_exponent) >= 1:
                    curr_sum = ""
                if int(best_exponent) > 1:
                    final_statement += str(curr_sum) + letter + "^" + str(best_exponent) + "+"
                if int(best_exponent) == 1:
                    final_statement += str(curr_sum) + letter + "+"
                if int(best_exponent) == 0:
                    final_statement += str(curr_sum)
        print(final_statement)
        return final_statement
    if exponent > 1:
        calculate(sending_values, exponent, original_parantes, letter)


def expand(expr):
    exponent = int(expr[-1])
    letters = "abcdefghijklmnopqrstuvwxyz"
    numbers = "1234567890"
    a = ""
    x = ""
    b = ""
    a_find = True
    count = 0
    for i in expr[1:]:
        if i == ")":
            break
        if i in letters:
            a_find = False
            x += i
            if a == "":
                if expr[count] == "-":
                    a += "-"
                a += "1"
        if i in numbers and a_find:
            if expr[count] == "-":
                a += "-"
            a += i
        if not a_find and i in numbers:
            if expr[count] == "-":
                b += "-"
            b += i
        count += 1
    r_a_x = a + x
    orig_parates = (r_a_x, b)
    if exponent > 1:
        final_statement_2 = calculate(orig_parates, exponent, orig_parates, x)
        return final_statement_2
    if exponent == 0:
        return "1"
    if exponent == 1:
        if a == "1":
            a = ""
        if a == "-1":
            a = "-"
        returnation = str(a) + str(x) + str(b)
        return returnation


print(expand("(5m+3)^4"))
print("should not return None, but instead 625m^4+1500m^3+1350m^2+540m+81")

  • When I run this I get in `expand` and `exponent` of `4`. When this is passed to `calculate` that is processed in `if exponent > 1: ...` and there is no `return` in that case. – Adrian Klaver Mar 25 '22 at 19:52
  • In `calculate()`, there's no `return` before the recursive call in the final `if`. – Barmar Mar 25 '22 at 19:59
  • @Barmar i dont quite understand what you mean by that. The ```if exponent == 1:``` triggers in the last recursion where ```exponent == 1``` , and that ```if``` statement contains a ```return``` function. The ```print``` right above return triggers and prints the output – Wukidukiduu Wukidukiduu Mar 25 '22 at 20:22
  • There's no `return` statement here: `if exponent > 1: calculate(sending_values, exponent, original_parantes, letter)` – Barmar Mar 25 '22 at 20:23
  • @Barmar is that required, even though it eventually will reach the ```if``` statement with a ```return``` statement? – Wukidukiduu Wukidukiduu Mar 25 '22 at 20:25
  • Yes, it's required, because that only returns from that level, it doesn't make the caller return the value. See https://stackoverflow.com/questions/27691547/recursive-function-does-not-return-specified-value – Barmar Mar 25 '22 at 20:27
  • @Barmar wow thank you so much dude, this has been annoying me for quite a long time, means so much. – Wukidukiduu Wukidukiduu Mar 25 '22 at 20:42
  • @AdrianKlaver Thanks to you aswell, appreciate the help very much ! – Wukidukiduu Wukidukiduu Mar 25 '22 at 20:43

0 Answers0