2016-12-10 16 views
0

私はこのPython関数をJavascriptに変換しようとしています。私はPythonを初めて使うので、構文のいくつかは私が暗号化するのが難しいです。ここでは元のコードとJS変換での私の試みの両方があります。私は何かを間違って解釈したことを知っています。なぜなら私の今のところは無限ループなのですから。括弧内のPython forループの構文

のPython:

'use strict'; 
const graph = [[0,1,0,0,1,0],[1,0,1,0,1,0],[0,1,0,1,0,0],[0,0,1,0,1,1],[1,1,0,1,0,0],[0,0,0,1,0,0],]; 

function N(vertex){ 
    let c = 0; 
    const l = []; 
    for (let i in graph[vertex]){ 
     if (i){ 
     l.push(c); 
     c++; 
     } 
    } 
    return l; 
} 

function bronk(r,p,x){ 
    if (p.length == 0 && x.length == 0){ 
    console.log(r); 
    return; 
    } 
    for (let vertex in p.slice(0)){ 
    const r_new = r.slice(0); 
    r_new.push(vertex); 
    const p_new=p.filter(val=>~~N(vertex).indexOf(val)); //here´s my best guess... 
    const x_new=x.filter(val=>~~N(vertex).indexOf(val)); 
    bronk(r_new, p_new, x_new); 
    p=p.splice(vertex,1); 
    x.push(vertex); 
    } 
} 

bronk([], [0,1,2,3,4,5], []); 

私はthis質問からPythonコードを持って:

graph = [[0,1,0,0,1,0],[1,0,1,0,1,0],[0,1,0,1,0,0],[0,0,1,0,1,1],[1,1,0,1,0,0],[0,0,0,1,0,0]] 

def N(vertex): 
    c = 0 
    l = [] 
    for i in graph[vertex]: 
     if i is 1 : 
     l.append(c) 
     c+=1 
    return l 

def bronk(r,p,x): 
    if len(p) == 0 and len(x) == 0: 
     print r 
     return 

    for vertex in p[:]: 
     r_new = r[::] 
     r_new.append(vertex) 
     p_new = [val for val in p if val in N(vertex)] #this and 
     x_new = [val for val in x if val in N(vertex)] #this part was particularly difficult to understand 
     bronk(r_new,p_new,x_new) 
     p.remove(vertex) 
     x.append(vertex) 

bronk([], [0,1,2,3,4,5], []) 

そしてここでは、JSへの変換での私の試みです。

編集:私はES6環境で作業しています。

答えて

3

彼らは、あなたが(ES6、バベルとの関係がなければ)JavaScriptでPythonでリストの内包表記に得ることができる最も近い(Pythonのマップと同様に)Array.Map

を使用することですのpython

の両方List comprehensionsですJavaScriptでのpython

>>> l = [2, 4, 6, 8, 10, 12] 
>>> [int(i/2) for i in l] 
[1, 2, 3, 4, 5, 6] 

例:

l = [2, 4, 6, 8, 10, 12] 
l.map(function(i){ return i/2 }); 
[1, 2, 3, 4, 5, 6] 
はES6で Arrow functions

、あなたがfunction(){}

l.map(x => x/2) 
[2, 4, 6, 8, 10, 12] 

を取り除くことができますので、あなたのコードは、この

const p_new = p.map(function(i){ if(i in N(vertex)){ return i } }); 
const x_new = x.map(function(i){ if(i in N(vertex)){ return i } }); 
+0

xをxにマッピングする目的は何ですか?これはマップを全く持たないのと同じではないでしょうか?だから私はまだPythonコードが何をしようとしているのかはまだ分かりません... –

+0

私はマッピングを修正しましたが、アルゴリズムの再帰呼び出しはスタックサイズを超えています – danidee

+0

'Array.splice'も位置によって削除されます、pythonの 'list.remove'のような値ではありません – danidee

2

のようになります。使用する方がよいでしょう:

p.filter(val => graph[vertex][val]) 

として、これは、Nが行う無駄な配列作成を省略します。

また~~適切truefalse0-1 .. nを変換しません。代わりに!!~を使用してください。

+0

まだ完全に正しく変換されていないか、ソースのPythonコードに問題があります...まだ無限ループです:https://jsfiddle.net/ilpo/d1b0pgga/ –

関連する問題