2017-07-27 153 views
-4

這與HackerRank算法問題'Kangaroo'有關。函數返回undefined。爲什麼?

這裏是我的代碼:

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);

這就是問題所在:

上有許多行準備在正方向跳2只袋鼠(即,朝着正無窮大)。第一隻袋鼠從地點開始,以每跳跳米數的速度移動。第二隻袋鼠從地點開始,以每次跳躍米數的速度移動。考慮到每隻袋鼠的起始位置和移動速度,你能否確定它們是否會同時登陸同一地點?

x1爲袋鼠的起點1

V1-是袋鼠的速度1.

X2是袋鼠2.

V2的起點是速度袋鼠2.

我的代碼返回undefined,爲什麼?

+7

'回報袋鼠(X1 + V1,V1,X2 + V2,V2)'你不返回遞歸調用 –

+2

[遞歸函數的可能重複的結果返回undefined](https://stackoverflow.com/questions/12737970/recursive-function-returns-undefined) –

回答

1

請了解recursion第一:d

遞歸調用需要意味着你需要返回kangaroo

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

謝謝。我很難學習。 :) – Abhilash

0

這可能看起來等於自稱爲:

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); 
} 

但實際上它可能會得到尾部調用優化,所以它的運行速度要快得多,因爲它是這樣執行的:

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

你可以去一個相對簡單的方法,複雜度將是O(n)。 只有經過一定數量的跳躍之後,它們纔會再次相遇,它們處於相同的位置。讓它們在j次跳躍後再次相遇,這意味着我們得到j =(x1-x2 )/(v2-v1) 現在跳轉次數不能是負數也不是小數。所以你所要做的就是檢查j是否是整數。 在Python中,你可以不喜歡它:

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