我正在學習 Java,但遇到了遞回問題。
我需要使用遞回方法來檢查一個數字是否是Armstrong 數字。
我的代碼:
public class ArmstrongChecker {
public boolean isArmstrong(int number) {
// check if the number is a negative number
if (number < 0) {
return false;
}
ArmstrongChecker armstrongChecker = new ArmstrongChecker();
// find the length of the number
int length = armstrongChecker.lengthChecker(number);
// create a variable to store the sum of the digits of the number
int sum = 0;
// find the individual digits and raise to the power of the numbers of digits
if (number != 0) {
int digit = Math.floorMod(number, 10);
int powerRaised = (int) Math.pow(digit, length);
sum = sum powerRaised;
isArmstrong(number / 10);
}
return sum == number;
}
// method to check the length of the number
public int lengthChecker(int number) {
int length = String.valueOf(number).length();
return length;
}
}
如何防止方法中的int 長度isArmstrong()改變其值。
uj5u.com熱心網友回復:
雖然您沒有在發布的代碼中更改它的值,但您可以將該變數標記為常量。這樣,如果您嘗試分配新值,編譯器可能會出錯。
final int length = armstrongChecker.lengthChecker(number);
uj5u.com熱心網友回復:
正如我在評論中已經說過的,您的解決方案存在以下問題:
- 遞回呼叫的結果
isArmstrong()被忽略; - 無需生成
ArmstrongChecker. 而且這種方法根本不需要創建物件,它可以實作為static. - 檢查數字是否是阿姆斯特朗數歸結為計算其阿姆斯特朗和,如果僅使用遞回實作這部分,則解決方案將更清晰。
它可能看起來像這樣:
public static boolean isArmstrong(int number) {
if (number < 0) return false;
if (number < 10) return true;
return number == getArmstrongSum(number, String.valueOf(number).length());
}
public static int getArmstrongSum(int number, int power) {
if (number == 0) {
return 0;
}
return (int) Math.pow(number % 10, power) getArmstrongSum(number / 10, power);
}
main()
public static void main(String[] args) {
System.out.println(isArmstrong(370)); // true
System.out.println(isArmstrong(12)); // false
System.out.println(isArmstrong(54)); // false
System.out.println(isArmstrong(153)); // true
}
輸出:
true
false
false
true
uj5u.com熱心網友回復:
您需要為整個遞回獲取一次長度,因此最簡潔的方法是將數字和長度都傳遞給遞回。一個簡單的方法是讓一個方法是 API 的公共面,另一個進行遞回。
public class ArmstrongChecker {
public boolean isArmstrong(int number) {
if (number < 0) {
return false;
}
int length = lengthChecker(number);
int sum = armstrongSum(number, length);
return sum == number;
}
private int armstrongSum(int number, int length) {
int sum = 0;
if (number != 0) {
int digit = Math.floorMod(number, 10);
int powerRaised = (int) Math.pow(digit, length);
sum = powerRaised;
sum = armstrongSum(number / 10, length);
}
return sum;
}
public int lengthChecker(int number) {
int length = String.valueOf(number).length();
return length;
}
}
這在遞回中很常見,其中演算法遞回部分的引數與您希望 API 的客戶端必須傳入的引數略有不同(通常有更多引數)。每個遞回中的數字都會發生變化呼叫, wherenumber / 10被傳遞下來,但相同length的一直傳遞。
請注意,遞回使用來自遞回呼叫的回傳值,并且當您已經在類的實體方法中時,armstrongSum無需創建另一個實體。ArmstrongChecker
uj5u.com熱心網友回復:
number僅將其作為引數很難做到這一點,因此我稍微編輯了該方法:
class Main {
public static void main(String[] args) {
System.out.println(isArmstrong(555,555,0));
System.out.println(isArmstrong(153,153,0));
}
public static boolean isArmstrong(int number, int copy, int curr){
if(copy == 0 && curr == number){
return true;
}
else if(copy == 0){
return false;
}
curr = (int)(Math.pow(copy % 10, String.valueOf(number).length()));
copy /= 10;
return isArmstrong(number, copy, curr);
}
}
我們使用 3 個引數來代替:number、copy和curr:copy最初將存盤與 相同的值number,盡管我們會在每次遞回訪問每個數字時更改該值。curr將存盤數字立方和的當前值。
雖然 的值copy不是0,但我們將curr通過添加 的最后一位數字的冪來更新 的值curr,然后curr通過將其除以 10 來洗掉該數字。
我們重復這個程序,直到copyis 0。如果curr與 的值匹配number,則回傳true,否則回傳false。
您還可以創建一個輔助方法,這樣當您呼叫該函式時,您仍然只輸入一個引數:
class Main {
public static void main(String[] args) {
System.out.println(isArmstrong(555));
System.out.println(isArmstrong(153));
}
public static boolean isArmstrong(int number){
return isArmstrong(number, number, 0);
}
public static boolean isArmstrong(int number, int copy, int curr){
if(copy == 0 && curr == number){
return true;
}
else if(copy == 0){
return false;
}
curr = (int)(Math.pow(copy % 10, String.valueOf(number).length()));
copy /= 10;
return isArmstrong(number, copy, curr);
}
}
兩者的輸出:
false
true
我希望這有幫助!如果您需要任何進一步的幫助/說明,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/496806.html
上一篇:可序列化欄位字串JSON
