Why does this recursive function return undefined?

I am trying to write a function that concatenates two strings using recursion. My code is below, but I don’t know why the function returns undefined, especially when I console.log in the base case and does not print undefined, but instead the correct value.

var str3=""
function merge(str1,str2){
    if(str1.length==0||str2.length==0){
        console.log(str3)
        return str3;
    }
    else{
        str3=str3+str1.substring(0,1)+str2.substring(0,1);
        merge(str1.substring(1,str1.length),str2.substring(1,str2.length))
    }
}

merge("AAA","BBB") //--> returns undefined but the console.log(str3) gives correct answer
+5
source share
2 answers

Explanation

The problem is that you are not returning the result of the recursive call, so it is undefined when the entire call is mergeresolved.

Let me do it step by step:

  1. With arguments "AAA"and "BBB"their lengths not equal 0, go to another. Otherwise there str3is "AB", call merge("AA", "BB").
  2. "AA" "BB" 0, . str3 "ABAB", merge("A", "B").
  3. "A" "B" 0, . str3 "ABABAB", merge("", "").
  4. 0. if, str3 .
  5. merge("", "") ( "ABABAB" ), , merge("A", "B"), , "" .
  6. , merge("A", "B"), else. , . , undefined. "" , merge("AA", "BB"), .
  7. , merge("AA", "BB"), else. , . , , undefined. "" , merge("AAA", "BBB"), .
  8. , merge("AAA", "BBB"), else. , . , , undefined. , - merge("AAA", "BBB") undefined.

TL; DR: else, str3 merge("A", "B"). merge("A", "B") , undefined. - return else, undefined. , undefined.


, return . , , "" str3 - "ABABAB", undefined.

, 6, 7 8 return. , undefined, str3. , merge("", "") "ABABAB", str3. merge("A", "B") - return, merge("AA", "BB") .., , str3.

:

var str3 = "";
function merge(str1, str2) {
    if(str1.length == 0 || str2.length == 0) {
        console.log(str3);
        return str3;
    } else {
        str3 = str3 + str1.substring(0, 1) + str2.substring(0, 1);
        return merge(str1.substring(1, str1.length), str2.substring(1, str2.length)); //we return the recursive call
    }
}

var mergedString = merge("AAA","BBB"); //mergedString is "ABABAB"
Hide result

mergedString undefined. , , str3, mergeString.

+11

, return :

var str3=""
function merge(str1,str2){
    if(str1.length==0||str2.length==0){
        console.log(str3)
        return str3;
    }
    else{
        str3=str3+str1.substring(0,1)+str2.substring(0,1);
        return merge(str1.substring(1,str1.length),str2.substring(1,str2.length))
    }
}

merge("AAA","BBB")
0

Source: https://habr.com/ru/post/1653618/


All Articles