【问题标题】:Reduce sum of digits recursively down to one digit number将数字总和递归减少到一位数字
【发布时间】:2019-10-12 06:12:18
【问题描述】:

如何使用递归使函数返回所有数字的总和,直到它变为 1 位数字?我能够创建一个函数来获取所有数字的总和,但似乎无法找到一种方法来递归地对总和本身的数字求和:

class sum_of_digits 
{ 

    static int sum_of_digit(int n) 
    {  
        if (n == 0) 
            return 0; 
        return (n % 10 + sum_of_digit(n / 10)); 
    } 

    public static void main(String args[]) 
    { 
        int num = 12345; 
        int result = sum_of_digit(num); 
        System.out.println("Sum of digits in " +  
                           num + " is " + result); 
    } 
} 

此代码打印“12345”的总和,即 15。但我需要对其进行更改,以便打印 1 + 5 的总和,即 6。

【问题讨论】:

  • 创建一个方法 recursiveSumUntilOneDigitLeft()。从 main 调用它。在此方法中,调用 sum_of_digit()。如果结果多于一位,请使用结果调用 recursiveSumUntilOneDigitLeft()。
  • @JBNizet 它有效,谢谢。您认为没有其他方法可以使其工作吗?
  • 确保在出现负值的情况下添加边界检查

标签: java recursion methods


【解决方案1】:

如果您结合 sum_of_digit 定义一个额外的递归“层”,事情会变得容易得多。这个新函数可以调用 sum_of_digit 直到它有一个数字作为结果。这就是我的意思:

static int sum_to_one_digit(int n) {
    if(n/10 == 0) return n;
    return sum_to_one_digit(sum_of_digit(n));
}

来自 main 的代码将是:

public static void main(String args[]) 
{ 
    int num = 12345; 
    int result = sum_to_one_digit(num); 
    System.out.println("Sum of digits in " +  
                   num + " is " + result); 
} 

【讨论】:

  • 它有效,谢谢。您认为没有其他方法可以使其工作吗?
  • @Lior 在保持 sum_of_digit 递归的同时,什么都不会立即弹出给我。也许你可以想出一个聪明的基本案例+递归步骤。然而,更简单的方法可能是迭代地定义函数。
【解决方案2】:

有几种方法可以做到,如果允许全局变量,一种是这样的:

public class Sum_of_digits{
        static int sum = 0;

    public static void main(String args[]){

        int n = 12345;
        System.out.println(sum_of_digit(n));
        sum = 0;

    }
    static int sum_of_digit(int n){

        if(n==0){
            if(sum/10 == 0){
                return sum;
            }else{
                n=sum;
                sum=0;
            }
        }
        sum = sum+(n%10);
        n=n/10;
        return sum_of_digit(n);

    }
}

如果不允许使用全局变量,那么将 sum 作为参数传递会有所帮助:

public class Sum_of_digits{


        public static void main(String args[]){

            int n = 12345;
            int sum = 0;
            System.out.println(sum_of_digit(n,sum));

        }
        static int sum_of_digit(int n,int sum){

            if(n==0){
                if(sum/10 == 0){
                    return sum;
                }else{
                    n=sum;
                    sum=0;
                }
            }
            sum = sum+(n%10);
            n=n/10;
            return sum_of_digit(n,sum);

        }
    }

这里我们只是将焦点从 n 转移到 sum 以评估循环/递归终止的条件。

【讨论】:

  • 为清楚起见,此回复还解决了@Lior 的后续评论,询问是否可以不使用其他方法。
  • 我不提倡使用全局 sum 变量。重复调用 sum_of_digit 会出现意外行为,因为您没有清除它。
  • 全局可修改变量是邪恶的,不要使用它们,将它们作为参数传递或保持本地
  • 同意,如果控制不当,修改全局变量会产生意想不到的问题。它应该在程序结束时重置或根本不使用。修改第一个例子。
【解决方案3】:

您可以在末尾添加一个子句来检查总和是否小于10,如果不是,则使用新计算的总和再次递归调用它,即。

static int sum_of_digit(int n)
{
    if (n == 0)
        return 0;
    int temp = (n % 10 + sum_of_digit(n / 10));
    if (temp < 10)
        return temp;
    return sum_of_digit(temp);
}

【讨论】:

    【解决方案4】:

    您认为无需额外的操作就可以使其工作吗? 方法?

    为什么我们不能让递归为我们完成工作并简单地说:

    static int sum_of_digit(int n) 
    {  
        if (n < 10) 
            return n;
    
        return sum_of_digit(n % 10 + sum_of_digit(n / 10)); 
    } 
    

    【讨论】:

    • @TFT,这里有两个问题。首先,您的原始评论对我来说暗示了一个不存在的语法错误——您的建议是逻辑更改。其次,你对问题的理解是错误的。重读OP的描述,具体来说,“直到它变成一个1位数字,使用递归”。
    • 好的,我现在明白了,很抱歉造成误解,哈哈!无论如何,谢谢你的解释
    猜你喜欢
    • 2016-01-31
    • 2021-10-01
    • 2022-11-13
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2015-08-30
    • 2020-03-19
    • 2017-06-06
    相关资源
    最近更新 更多