2017-06-30 9 views
1

私は初心者で、この最初の投稿(プラス私はネイティブの英語話者ではない)ですので、私のコードや英語が2つの数値が与えられているので、私はJavaScript関数を書いて、第2のものが最初のものの力であるかどうかを調べ、その力を決定したい(例:2,8出力は3でなければならない)。私は2つの機能を書いていましたが、どちらも機能していますが、それらをまとめることはできません。どのように2つの関数を組み込んで、再帰を使用するか

これは、2番目の数字が最初の数字の威力であるかどうかを確認する最初の方法です。

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 

がどのように私は1つの関数にそれらを一緒に置くことができます。

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 

第二の機能は、あなたに不可欠な対数を与えるのだろうか?私は閉鎖が必要だと思うが、私はその仕事をする方法を見つけられなかった。

答えて

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. 

はあなたのためにこの仕事をしていますか?

もう1つの可能性は、関数を完全に結合することです。を試して、対数(「グレード」と呼ばれるもの)を探します。それがうまくいくなら、あなたはあなたの答えを得ます。失敗した場合(y%x !== 0)、障害を報告します。

+0

ありがとう、それは動作します! – Amedeo

0

私の方法が異なるかどうかはわかりませんが、私はそれを以下に実装しました。実際のアプリケーションでは、入力の型チェックをさらに3回行い、3番目の引数があるかどうかをチェックします。デフォルトでは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" 
 
}

関連する問題