2017-03-28 4 views
0

Die Funktion funktioniert zufällig wie erwartet und gibt manchmal undefined zurück. Das verstehe ich nicht.Rekursive Funktionen gibt erwarteten String-Wert zurück und manchmal undefiniert?

Kann jemand erklären, wie Javascript funktioniert, wenn es Funktionsaufrufe für dieses Beispiel in einem rekursiven Muster wiederholt.

main Die Funktion nimmt zwei Argumente

Erste Arg: eine ganze Zahl, die die Anzahl von Zeichen darstellt, es aus dem zweiten Argument wird. Zweites Arg: Eine Zeichenfolge.

Der gesamte Code

var getRandomIntInteger = function (min, max) { 
    min = Math.ceil(min); 
    max = Math.floor(max); 
    return Math.floor(Math.random() * (max - min + 1)) + min; 
} 

function recursive(arr, string, limit) { 

    if (string.length >= limit) { 
     return string 
    } 
    else { 
     // get random integer within the range of the array ength 
     var randIndex = getRandomIntInteger(0, arr.length) 
     // concatenate that value sitting at that index 
     string += arr[randIndex] 
     // remove that value from the array 
     arr.splice(randIndex, 1) 
     // re-run 
     return recursive(arr, string, limit) 
    } 

} 

var main = function(k, i) { 
    let inputArray = Array.from(i) 
    console.log('k=',k, 'inputArray length = ', inputArray.length) 


    if (k >= i.length) { 
     return 'sameple size must not exceed ' 
    } 
    let s = "" 
    var res = recursive(inputArray, s, k) 
    console.log('result = ', res) 
    return res 

} 

// run the function 
main(4, "ABCDEFGHI") 

Dieser Funktionsaufruf manchmal gibt 4 zufällige charactors und manchmal undefined zurück, auch wenn die Funktion mit den gleichen Argumenten aufgerufen wird.

+1

Wo ist der [Debug-Trace] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)? Sie sollten uns die Zahlen anzeigen können, die Sie aus ** getRandomInteger ** erhalten, die Werte der Argumente, die in jeder Routine angezeigt werden usw. – Prune

+0

Welche Sprache ist das? Sie sollten das Sprach-Tag hinzufügen – user31264

Antwort

1

Durch die Art und Weise haben Sie Ihre Zufallsfunktion definieren Sie diesen Aufruf ändern soll:

var randIndex = getRandomIntInteger(0, arr.length) 

dazu:

var randIndex = getRandomIntInteger(0, arr.length - 1) 

... da das zweite Argument ist eine Zahl, die erzeugt werden könnten von getRandomIntInteger, noch arr[arr.length] ist immer undefined.

Verwandte Themen