2017-06-30 68 views
1

之內遞歸我是一個初學者,這是我的第一篇文章(加上我不是英語母語的人),所以請原諒我,如果我的代碼和/或我的英文是bad.Given我想編寫一個JavaScript函數來發現兩個數字是否第二個是第一個的冪,然後確定功率(例如:2,8輸出必須是3)。我寫了兩個函數,都可以工作,但我不能把它們放在一起。我是如何把兩個功能放在一起的,這兩個功能都在

這是第一個檢查第二個數字是否是第一個數字的力量。

function checkNumbers(x,y){ 
    if (y%x !==0){ 
    return "this numbers are not valid" 
    } 
    else if(x===y) { 
    return "correct!" 
    } 
    else { 
    y=y/x 
    return checkNumbers(x,y) 
    } 
} 

checkNumbers(2,8) // will give the first answer 
checkNumbers(2,18) // will give the second answer 

第二個功能會給你的積分數:

count =1; 

function findGrade(x,y) { 
    if(y/x===1) 
    return "the grade is " + count; 

    count++; 
    y = y/x; 
    return findGrade(x,y) 
} 

findGrade(2,8) // output 3 
findGrade(2,16) // output 4 

我怎樣才能把它們連成一個功能?我想我需要一個關閉,但我沒有找到辦法做到這一點。

回答

0

的解決方案是,其實很簡單。

你可以做到以下幾點:

function findGrade(x, y, count = 1) { 
    // If the numbers are not valid, throw an error. The execution is interrupted. 
    if(y % x != 0) throw "Invalid inputs"; 

    // If the inputs are different, continue the execution and add 1 to count. 
    if(x != y) return findGrade(x, y/x, ++count); 

    // If none of the above are true, you have your result! 
    return count; 
} 

測試:

console.log(findGrade(2, 8));  // Outputs 3 
console.log(findGrade(2, 16));  // Outputs 4 
console.log(findGrade(2, 3));  // Error: Invalid inputs 
console.log(findGrade(3, 3486784401)); // Outputs 20 

請讓我知道如果你需要任何進一步的幫助。

+1

哦,太棒了,這是完美的,更容易,我試圖做的。你教過我很多,非常感謝你! – Amedeo

+0

不客氣:)請不要忘記選擇你的問題的最佳答案! @amedeo – tiagodws

1

checkNumbers應該返回一個布爾值,而不是消息。然後findGrade可以檢查結果,看它是否應該計算對數。類似這樣的:

function checkNumbers(x,y){ 
    if (y%x !==0){ 
    return false 
    } 
    else if(x===y) { 
    return true 
    } 
    // the rest of your function remains the same. 

function findGrade(x,y) { 
    // First, check to see whether y is a power of x 
    if checkNumbers(x,y) { 
    // your original findGrade function goes here 
    } 
    else 
    return -1; // Use this as a failure code. 

這是否適合您?

另一種可能性是完全組合功能:嘗試找到對數(你稱之爲「等級」);如果它有效,你會得到你的答案;如果失敗(在y%x !== 0),則報告失敗。

+0

謝謝你,它的工作原理! – Amedeo

0

我不確定我的方法是否不同,但我在下面實現了它。在真實世界的應用程序中,我會對輸入做更多的類型檢查,並檢查是否有第三個參數:如果不是默認爲0(第一次迭代默認計數爲0),但這是一般想法。你可以運行下面的代碼片段。

// Arguments 
 
// 1: Base of Exponent 
 
// 2: test Number 
 
// 3: count by reference 
 

 
function checkPower (base, test, count) { 
 
    let division = test/base 
 
    // base case 
 
    if (division === 1) { 
 
    count++ 
 
    return count 
 
    } else if (division < 1) { 
 
    console.log("not a power") 
 
    return; 
 
    } 
 
    // iteration step 
 
    count++ 
 
    return checkPower(base, division, count++) 
 
} 
 

 
// Test Cases 
 

 
let test = checkPower(2, 32, 0) 
 
if (test) { 
 
    console.log(test) // 5 
 
} 
 

 
test = checkPower(2, 1024, 0) 
 
if (test) { 
 
    console.log(test) // 10 
 
} 
 

 
test = checkPower(2, 9, 0) 
 
if (test) { 
 
    console.log(test) // "not a power" 
 
}