我需要使用递归找到一个数字的每个数字的阶乘的和。
迭代地做这件事相对简单,但我应该递归地做。
我还没有找到解决方案。我只得到了这个问题的一小部分。
查找阶乘的方法
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)
我相信这就是你想要做的。我重命名了你的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方法的调用将展开(返回),将计算并存储在堆栈中的返回阶乘相加,最终返回最终和。
考虑这一点的关键是,调用堆栈将本地值存储在堆栈上,然后当方法返回时,这些本地值将被恢复并执行。递归编程有其优点。但因为它涉及重复的方法调用,所以效率不高。由于调用堆栈是有限的(但很大),它可能会由于不受约束的方法调用而溢出。
我还建议将打印报表放在求和法中。您甚至可以将最后一个return语句分解为两部分。通过打印n和计算的阶乘,将有助于了解这是如何产生答案的。
我已经输入了以下代码及其输出,以显示正在发生的事情。只有求和方法才有打印语句。
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
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
作为输入。在相同的示例CCD_ 7中。
实例的结果是CCD_ 8。
你现在想做的不是把数字本身加起来,而是把它们的阶乘加起来,所以你可以用余数作为参数来调用阶乘函数,并把它加到尾部计算中,而不仅仅是数字本身。
请注意,对于较大的数字,这会变得有点计算密集。你可以使用一种名为"记忆"的技术来记住(或预先计算)你需要的阶乘。毕竟,你只使用0-9的阶乘。您可以预先计算这些,并将它们存储在一个数组中,以优化您的代码。我预计这将是这项明显的家庭作业中的下一项;-)
您应该为单独的数字实现另一个调用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);
}