2012-10-27 78 views
5

我被困在以下函數出現在我也審查了一些其他職位。Eloquent Javascript的findSequence澄清

function findSequence(goal) { 
    function find(start, history) { 
    if (start == goal) 
     return history; 
    else if (start > goal) 
     return null; 
    else 
     return find(start + 5, "(" + history + " + 5)") || 
      find(start * 3, "(" + history + " * 3)"); 
} 
    return find(1, "1"); 
} 

print(findSequence(24)); 

也在此鏈接中給出。

Javascript..totally lost in this tutorial

在上述說明中,答案不是試圖設置的11目標它們具有1的起動,這是針對第一測試11,然後其被針對11測試的6開始

我明白了前兩個步驟。但是,我不明白從第二步(比較start:6到goal:11)到第三步(比較start:3到goal:11)的飛躍。

start如何從6降回到3然後回到11(第四個子彈)?

+0

英語是我的第一語言。 –

+0

這篇文章中的解釋非常有用,這就是我提供鏈接的原因。 – KMcA

+1

檢查這個答案 - 也許它可以澄清。 http://stackoverflow.com/questions/7540111/javascript-closure-tutorial-from-eloquent-javascript?lq=1 – c69

回答

7

好的,這是一個使用控制檯日誌語句增強的代碼版本。打開Chrome /歌劇/火狐eveloper工具和執行該代碼有:

function findSequence (goal) { 
    function find (start, history, depth) { 
    depth = depth || 0; 
    console.log(Array(++depth).join('--> '), start, goal, history); 
    if (start == goal) { 
     console.warn('history'); 
     return history; 
    } else if (start > goal) { 
     console.error('null'); 
     return null; 
    } else { 
     console.info('recursion!'); 
     return find(start + 5, "(" + history + " + 5)", depth) || 
      find(start * 3, "(" + history + " * 3)", depth); 
    } 
    } 
    return find(1, "1"); 
} 

console.info(findSequence(24)); 

您將獲得此程序的呼叫跟蹤,並希望將把握遞歸直觀的概念,通過觀察跡線上。

+0

我同意這會幫助他理解概念,但通過他的評論我會說他的困惑在於'||'。 – pedrofurla

+0

這正是我需要看到並完美回答我的問題。非常感謝你。 – KMcA

+1

pedrofurla,所以,由於左側最終返回null,這是錯誤的,並觸發右側開始。正確? – KMcA