2017-07-27 3 views
-4

Dies steht in Zusammenhang mit dem HackerRank-Algorithmusproblem 'Kangaroo'.Funktion gibt undefined zurück. Warum?

Hier ist mein Code:

function kangaroo(x1, v1, x2, v2) { 
 
     // Complete this function 
 
     if(x2>x1 && v2>v1)return "NO"; 
 
     if(x1>x2 && v1>v2)return "NO"; 
 
     if(x1 == x2){ 
 
      return "YES"; 
 
     }else{ 
 
     kangaroo(x1+v1,v1,x2+v2,v2); 
 
    } 
 
    } 
 

 
var result = kangaroo(0,3,4,2); 
 
console.log(result);

Das ist das Problem:

Es gibt zwei Kängurus auf einer Zahlenskala bereit, in der positiven Richtung zu springen (dh , zur positiven Unendlichkeit). Das erste Känguru beginnt am Standort und bewegt sich mit einer Geschwindigkeit von Metern pro Sprung. Das zweite Känguru beginnt am Ort und bewegt sich mit einer Geschwindigkeit von Metern pro Sprung. Kannst du anhand der Startpositionen und Bewegungsraten für jedes Känguru feststellen, ob sie jemals gleichzeitig am gleichen Ort landen werden?

x1 ist der Ausgangspunkt des Känguruh 1.

die Geschwindigkeit des Känguruh 1.

x2-v1 ist der Ausgangspunkt von Känguru ist 2.

v2 ist die Geschwindigkeit der Känguru 2.

Mein Code gibt undefined zurück, warum?

+7

'return Känguru (x1 + v1, v1, x2 + v2, v2)' Sie Rückkehr nicht das Ergebnis der rekursiven Aufruf –

+2

Mögliche Duplikat [rekursive Funktion returns undefined] (https://stackoverflow.com/questions/12737970/recursive-function-returns-undefined) –

Antwort

1

Bitte erfahren Sie die recursion erste: D

der rekursive Aufruf Notwendigkeit, Anrufe selbst, die Sie kangaroo

return kangaroo(x1+v1,v1,x2+v2,v2); 
+0

Vielen Dank. Ich lerne immer noch. :) – Abhilash

0

Dies kann sieht gleich zurückkehren bedeuten müssen:

function kangaroo(x1, v1, x2, v2) { 
    if(x2>x1 && v2>v1)return "NO"; 
    if(x1>x2 && v1>v2)return "NO"; 
    if(x1 == x2) return "YES"; 
    return kangaroo(x1+v1,v1,x2+v2,v2); 
} 

Aber tatsächlich kann es Tail Call optimiert werden, so dass es viel viel schneller läuft, wie es so ausgeführt wird:

function kangaroo(x1, v1, x2, v2) { 
while(true){ 
    if(x2>x1 && v2>v1)return "NO"; 
    if(x1>x2 && v1>v2)return "NO"; 
    if(x1 == x2) return "YES"; 
    x1=x1+v1,x2=x2+v2; 
    } 
} 
0

Sie können einen einfacheren Ansatz wählen, bei dem die Komplexität O (n) ist. Sie treffen sich erst wieder, wenn sie sich nach einer bestimmten Anzahl von Sprüngen an der gleichen Position befinden. Treffen sie sich nach j wieder, so bedeutet das: x1 + j * v1 = x2 + j * v2 wir erhalten j = (x1-x2)/(v2-v1) jetzt Anzahl der Sprünge kann weder negativ noch Bruch sein. Alles, was Sie tun müssen, ist zu überprüfen, ob j eine positive ganze Zahl ist. In Python können Sie es gerne tun:

dis=x1-x2 
    vel=v2-v1 
    if dis%vel==0 and dis/vel>0: 
     print("YES") 
    else: 
     print("NO")