2016-07-28 15 views
-2

私は電子ブックEloquent Javascriptに従って、JavaScriptを学んでいます。第4章では、再帰関数を使用してリストのn番目の値にアクセスするのは困難です。私はちょうどそれを行うために再帰関数を書いていますが、正しい値にアクセスすることはできますが、何らかの不満の理由でそれを返すことはできません。なぜこの再帰関数は値を返さない

本で使用されるリストの定義が普遍的であるかどうかはわかりませんので、ここで説明します。基本的に各list要素は、値と次のリスト要素の両方を保持します。それは何らかの始まりのようなものです。ここに例があります。

list = { 
    value: 1, 
    rest: { 
     value: 2, 
     rest: { 
      value 3, 
      rest: null 
     } 
    } 
} 

ここに問題があります。

function arrayToList(array){ 
    var list = {rest:null}; 
    for(var i = array.length-1; i>=0;i--){ 
    list = { 
     value:array[i], 
     rest:list 
    } 
    } 
    return list; 
} 

/* 
function nth(list, element){ 
    for(var i = 0;i < element;i++){ 
    list = list.rest; 
    } 
    return list.value; 
} 
*/ 

function nth(list, index){ 
    console.log(index); 
    if(index < 1){ 
    console.log("Success", list.value); 
    return list.value; 
    } 
    else { 
    console.log("Fail"); 
    list = list.rest; 
    index--; 
    //console.log(index); 
    nth(list,index); 
    } 
} 

console.log(nth(arrayToList([10, 20, 30]), 1)); 
// → 20 

コメントアウトされたn番目の関数は、本が望むものを行いますが、再帰的ではありません。また、デバッグ用に余分なものが2つあります(console.log())。ご覧のように、「成功」と値を記録すると、正しい値が記録されます。しかし、直後に同じ値を返すと、未定義が返されます。

+0

関数値を返すことを忘れてしまったことは、私たちが何十回も答えたことです。私は何らかの理由で重複した参照を見つけられません。 – Prune

+0

私は尋ねない限り、それが私の問題であることをどのように知っていたでしょうか?問題の内容がわからないと、その問題に対する答えを探すことができません。 – Supetorus

答えて

2

を返さなければなりません...

function nth(list, index){ 
    console.log(index); 
    if(index < 1){ 
    console.log("Success", list.value); 
    return list.value; 
    } 
    else { 
    console.log("Fail"); 
    list = list.rest; 
    index--; 
    return nth(list,index); 
    } 
} 

次のように考えて -

を最初の呼び出しIが失敗するので、R1を再送信して失敗した後、再送信R2と成功しました。

あなたは正しくR1R2から値を返すが、あなたは、私はR1から復帰し、機能をバックアウトしなければなりません。

+0

実際には意味がありますが、それを試してみましょう。 – Supetorus

+0

私は間違いなくこれを再訪問する必要があります。それは私の脳を完全に揚げている。助けてくれてありがとう! – Supetorus

3

再帰を使用するには、関数呼び出しはあなたが再帰あなたから値を返す必要が

return nth(list,index); 
+0

私のnoob-nessを許していますが、私は理解しません。私は次の両方を試しましたが、どちらも正しく機能しませんでした。 関数nth(リスト、インデックス){ \t if(index <1){ \t return nth(list、index); \t} \t else { \t list = list.rest; \t index--; \t return nth(list、index); \t} \t} \t関数n番目(リスト、インデックス){ \t場合(インデックス=== 0){ \t戻り、n番目(リスト、インデックス)。 \t} else { \t index--; \t list = list。残り; \t} \t} – Supetorus

関連する問題