我需要使用遞回找到一個數字的每個數字的階乘總和。
以迭代方式執行此操作相對簡單,但我應該遞回執行此操作。
我還沒有得到解決方案。我只得到了這個問題的一小部分。
求階乘的方法
public static int factorial(int n) {
if (n==0){
return 1;
}
return n*factorial(n-1);
}
求數字總和的方法
public static int sum_of_digit(int n) {
if (n == 0){
return 0;
}
return (n % 10 sum_of_digit(n / 10));
}
我的問題是嘗試使用我現在所知道的來獲取每個數字的階乘并將它們相加。
編輯:(由作者從評論中提供):
例子
n=145 1! = 1 4! = 24 5!=120 (sum = 1 24 120)
uj5u.com熱心網友回復:
您應該實作另一個呼叫factorial單獨數字的函式:
public static int sum_of_digit_factorial(int n) {
if (n < 10) {
return factorial(n);
}
return factorial(n % 10) sum_of_digit_factorial(n / 10);
}
uj5u.com熱心網友回復:
我相信這就是你想要做的。我重命名了您的 sum 方法以說明其目的。
int v = sum_of_digit_factorials(325);
System.out.println(v);
印刷
128
方法
// the original factorial method
public static int factorial(int n) {
if (n==0){
return 1;
}
return n*factorial(n-1);
}
// the modified sum method.
public static int sum_of_digit_factorials(int n) {
if (n == 0){
return 0;
}
return factorial(n%10) sum_of_digit_factorials(n/10);
}
在呼叫該方法時,factorial 從最右邊的數字開始連續計算每個數字的階乘。此時,之前的任何呼叫sum_of_digit_factorials都沒有回傳。當n達到零時,對 sum 方法的呼叫將展開(回傳),將計算并存盤在堆疊中的回傳階乘相加,最終回傳最終和。
考慮這一點的關鍵是呼叫堆疊將本地值存盤在堆疊上,然后在方法回傳時,這些本地值被恢復并執行。遞回編程有其優點。但是因為它涉及重復的方法呼叫,所以效率不高。并且由于呼叫堆疊是有限的(但很大),它可能會由于不受限制的方法呼叫而溢位。
我還建議在 sum 方法中放置列印陳述句。您甚至可以將最后一個 return 陳述句分成兩部分。通過列印 n 和計算出的階乘,將有助于了解這是如何產生答案的。
我已經輸入了以下代碼及其輸出來顯示正在發生的事情。只有 summing 方法有列印陳述句。
public static int sum_of_digit_factorials(int n) {
System.out.println("sum_of_digit_factorials entered: n = " n);
if (n == 0) {
return 0;
}
int k = n % 10;
int f = factorial(k);
System.out.println(k " factorial = " f);
int sum = sum_of_digit_factorials(n / 10);
sum = f;
System.out.println("current sum = " sum);
return sum;
}
印刷
sum_of_digit_factorials entered: n = 325
5 factorial = 120
sum_of_digit_factorials entered: n = 32
2 factorial = 2
sum_of_digit_factorials entered: n = 3
3 factorial = 6
sum_of_digit_factorials entered: n = 0 // this triggers the return and the
// summing process begins.
current sum = 6
current sum = 8
current sum = 128
128 // the final result, printed in main
uj5u.com熱心網友回復:
public static int sum_of_digit(int n) {
if (n == 0){
return 0;
}
return (n % 10 sum_of_digit(n / 10));
}
在上面的方法中,部分n % 10是計算 n 除以 10 后的余數,例如32 % 10 = 2。
然后將其添加2到尾部計算中,n / 10用作輸入。在同一個例子中32 / 10 = 3。
該示例的結果是2 3 = 5。
您現在要做的不是將數字本身相加,而是將它們的階乘相加,因此您可以將余數作為引數呼叫階乘函式,并將其添加到尾部計算中,而不僅僅是數字本身。
請注意,對于較大的數字,這會變得有點計算密集。您可以使用一種稱為“記憶”的技術來記住(或預先計算)您需要的階乘。畢竟,您只使用 0 - 9 的階乘。您可以預先計算這些并將它們存盤在陣列中以優化您的代碼。我期待這是這個明顯的家庭作業中的下一個;-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329934.html
下一篇:使用遞回反射星號三角形
