递归java - 测试是两个整数之和是不是相等布尔函数

Posted

技术标签:

【中文标题】递归java - 测试是两个整数之和是不是相等布尔函数【英文标题】:Recursion java - Testing is the sum of the two Integers are equal Boolean function递归java - 测试是两个整数之和是否相等布尔函数 【发布时间】:2016-10-12 06:10:48 【问题描述】:

我写了一个接受两个整数的递归函数。如果第一个数字的位数等于第二个数字,则该函数返回true,否则该函数返回false。

该函数始终返回 true。

我做错了什么?

代码:

public static boolean amountEqual(int num1, int num2) 
    int sum1 = 0, sum2 = 0;

    if (num1 == 0 && num2 == 0 && sum1 == sum2)
        return true;
    else if (num1 == 0 && num2 == 0 && sum1 != sum2)
        return false;

    sum1 += num1 % 10;
    sum2 += num2 % 10;

    return amountEqual(num1 / 10, num2 / 10);

谢谢

【问题讨论】:

你的两个变量sum1sum2的目的是什么? 每个调用都有自己的sum1sum2 版本。如果您不想在调用之间共享状态,请将其作为参数传递。避免使用全局/实例变量的冲动。 sum1 = 第一个数字的所有数字之和 Sum2 = 第二个数字的所有数字之和 【参考方案1】:

我做错了什么?

您使用的是始终为零的sum。您需要找到一种方法来传递您的 sum1sum2,以便最终调用可以根据之前的所有调用做出决定。

一种方法是使用四个参数制作递归函数,并添加一个两参数重载来启动递归链:

public static boolean amountEqual(int num1, int num2) 
    return amountEqual(num1, num2, 0, 0);

private static boolean amountEqual(int num1, int num2, int sum1, int sum2) 
    ... // your recursive code goes here

另一种方法是计算位数微分,即num1 中的位数之和减去num2 中的位数之和,如果微分为零,则返回true

public static boolean amountEqual(int num1, int num2) 
    return digitDifferential(num1, num2) == 0;

private static int digitDifferential(int num1, int num2) 
    return (num1 != 0 || num2 != 0)
    ? num1%10 - num2%10 + digitDifferential(num1/10, num2/10)
    : 0;

【讨论】:

FWIW 如果将num1 的数字添加到sum 并从@987654335 中减去num2 的数字,则可以将sum1sum2 压缩为一个参数sum @。但这只是吹毛求疵。 @MargaretBloom 这是一个非常聪明的主意!我建议了另一种基于计算数字差分并在返回为零时返回true 的方法。谢谢! 第二种方法也是我刚要提出的,但略有改进:通过执行 num1 < 10 && num2 < 10 ? num1 - num2 : ... 跳过最后一次递归调用(以及随之而来的额外 div/mod 计算) 【参考方案2】:

每次调用 amountEqual 方法时的前两行代码 它用零初始化两个新变量 让我们跟踪你的递归

System.out.println(amountEqual(18,26));
      /* F(20,30) = F(18/10,26/10) [sum1 = 8 , sum2 = 6] 
           re init sum1 = 0 , sum2 =0

            F(1,2)  = F(1/10,2/10) [ sum1 = 1 , sum2 = 2] 
           re init sum1 = 0 , sum2 = 0 
                    F(0,0) = true */

【讨论】:

【参考方案3】:

首先,您的问题不清楚。我假设如果两个数字的数字总和相等,您希望函数返回 true。

其次,您假设数字的长度相同,但它们可能不一样。

第三,您没有将 sum1sum2 作为参数传递。

更简单的方法是创建两个函数,如下所示:

public static int digitSum(int num) 
    if (num > 0) 
        return num % 10 + digitSum(num / 10);
    
    else
        return 0;


public static boolean amountEqual(int num1, int num2) 
    return digitSum(num1) == digitSum(num2);

【讨论】:

当您只需要/ 时,为什么要/=? --- 通过 if (num < 10) return num; 跳过递归 他们没有假设两个数字的长度相等。当两个数字都为零时,代码终止,真,但由于非有效数字为零,隐式支持不同长度的数字。

以上是关于递归java - 测试是两个整数之和是不是相等布尔函数的主要内容,如果未能解决你的问题,请参考以下文章

js判断两个对象的值是不是相等

一个布尔递归函数,用于判断一个数字是不是在整数中出现偶数次

C语言如何求一个整数的各个位数之和

leetcode解题报告(两数之和,递归乘法)

[PTA]练习10-1 使用递归函数计算1到n之和

练习10-1 使用递归函数计算1到n之和(10 分