2017-07-27 148 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")