2016-11-30 1 views
1

내가 다른 입력 b에 주어진 입력 a에서, 2*x10*x+1의 나무를 recrusing의 바이너리 검색을 수행하는, 자바 스크립트를 사용하여 codeforces 737A를 해결하기 위해 시도하고, 그러나 내 프로그램만을 통해 검색 할 수 있습니다 보인다 노드는 이고, 해당 노드는 10*x+1입니다. 흥미롭고 왜? 감사.버기 이진 트리

var tt = readline().split(' '); 
var a = parseInt(tt[0]); 
var b = parseInt(tt[1]); 

print(f([],a,b)); 
function f(arr,x,b){ 
    if (x>b){ 
     return []; 
    }else if (x==b){ 
     return _add(arr,x); 
    }else{ 
     return (f(_add(arr,x),(2*x),b) || f(_add(arr,x),(10*x+1),b)); 
    } 
} 

function _add(array,x){ 
    var _arr = array.slice(); 
    _arr.push(x); 
    return _arr; 
} 

답변

1

빈 배열 대신 false을 반환해야합니다. 빈 배열은 왼쪽 분기 만 반복한다는 의미 인 true으로 해석됩니다.

은 (BTW, 다른 부품이 필요 다음 부분은 반환하지 않는 경우.)

function go(a, b) { 
 
    //var tt = readline().split(' '); 
 
    //var a = parseInt(tt[0]); 
 
    //var b = parseInt(tt[1]); 
 

 
    function f(arr, x, b) { 
 
     if (x > b) { 
 
      return false; // no []!!! 
 
     } 
 
     if (x == b) { 
 
      return _add(arr, x); 
 
     } 
 
     return (f(_add(arr, x), (2 * x), b) || f(_add(arr, x), (10 * x + 1), b)); 
 
    } 
 

 
    function _add(array, x) { 
 
     var _arr = array.slice(); 
 
     _arr.push(x); 
 
     return _arr; 
 
    } 
 

 
    return f([], a, b); 
 
} 
 
console.log(go(2, 162)); 
 
console.log(go(4, 42)); 
 
console.log(go(100, 40021));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

도움을 주셔서 감사합니다. 나는 []가 자바 스크립트의 진리 값이라는 것을 결코 알지 못했습니다. –

0

두 가지 문제 :

  1. Truthiness합니다. 자바 스크립트에서 위선 값은 false, null, undefined, 0, NaN 및 빈 문자열 ("")입니다. 다른 모든 값은 참입니다.

    당신은 기본 케이스에 대한 배열을 반환됩니다

    return []; 
    

    그래서이 항상 true가됩니다.

  2. 어떻게 || 연산자가 작동합니다. || 연산자가 단락되었습니다. 따라서 왼쪽 값이 진실이면 값을 반환하고 오른쪽 코드는 평가하지 않습니다.

    당신이 쓴 : 이후

    f(_add(arr,x),(2*x),b) || f(_add(arr,x),(10*x+1),b) 
    

    을 모든 경우 f()에서 그 표현은 기본적으로 falsy 아무것도 반환하지 : 같은 || 운영자가 결코 10*x+1 경우를 평가하지

    true || f(_add(arr,x),(10*x+1),b) 
    

    으로.

|| 연산자를 사용하는이 아닌 빈 배열을 선택하는 함수를 작성하거나 필요한 코드가 작동을 대신하거나 (대신 빈 배열의 기본 케이스에 대한 f() 반환 허위 또는 0 만들려면 어떤 알고리즘을 깨뜨리지 않을 수도 있습니다. 알고리즘을 모르므로 모르겠습니다.)

+0

문제 : why ([] == true)가 false를 반환합니까? –

+0

이것에 대해서는 확신 할 수 없지만'[]'실제로 진실입니다 : if ([]) {console.log ('HA')}''HA "를 출력합니다. '=='연산자가 아마도 타입 변환을 트리거하고있을 것입니다. '||'연산자는'=='보다는'if '처럼 동작합니다 :'[] || '망고'는''망고 ''가 아니라'[] ||를 반환합니다. console.log ('HA') '는'HA '를 인쇄합니다. – slebetman

+0

자바 스크립트의'=='는 어떻게 작동합니까? –