2017-06-30 2 views
1

Ich bin ein Anfänger und dies mein erster Beitrag hier (plus ich bin kein englischer Muttersprachler), also bitte vergib mir, wenn mein Code und/oder mein Englisch sind bad.Given zwei Zahlen möchte ich eine JavaScript-Funktion schreiben, um zu finden, wenn der zweite eine Macht des ersten ist, und dann bestimmen, dass Macht (zB: 2,8 der Ausgang muss 3 sein). Ich habe zwei Funktionen geschrieben, die beide funktionieren, aber ich kann sie nicht zusammensetzen.Wie ich zwei Funktionen zusammenfasse, beide mit einer Rekursion innerhalb

Dies ist der erste, der prüft, ob die zweite Nummer eine der ersten ist.

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 

Die zweite Funktion wird Ihnen das Integral Logarithmus geben:

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 

Wie kann ich sie in eine Funktion zusammen? Ich denke, ich brauche eine Schließung, aber ich habe nicht den Weg gefunden, diese Arbeit zu machen.

Antwort

0

Die Lösung ist in der Tat ziemlich einfach.

Sie können folgendes tun:

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; 
} 

Tests:

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 

Bitte lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen.

+1

oh toll, das ist perfekt und sehr einfach das, was ich versucht habe zu tun. Du hast mir viel beigebracht, vielen Dank !! – Amedeo

+0

Gern geschehen :) Bitte vergessen Sie nicht, die beste Antwort auf Ihre Frage zu wählen! @amedeo – tiagodws

1

checkNumbers sollte einen booleschen Wert, keine Nachricht zurückgeben. Dann kann findGrade dieses Ergebnis prüfen, um zu sehen, ob es den Logarithmus berechnen soll. Etwas wie dieses:

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. 

Funktioniert das für Sie?

Eine andere Möglichkeit ist, die Funktionen vollständig zu kombinieren: versuchen Sie, den Logarithmus zu finden (was Sie "Grad" nennen); Wenn es funktioniert, bekommst du deine Antwort; Wenn es fehlschlägt (unter y%x !== 0), melden Sie den Fehler.

+0

Danke, es funktioniert! – Amedeo

0

Ich bin mir nicht sicher, ob meine Methode anders ist, aber ich habe es unten implementiert. In der realen Welt würde ich noch mehr Eingaben auf Eingaben prüfen und prüfen, ob es ein drittes Argument gibt: Wenn nicht standardmäßig 0 (die erste Iteration ist standardmäßig die Zahl auf 0), aber das ist die allgemeine Idee. Sie können das Snippet unten ausführen.

// 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" 
 
}

Verwandte Themen