当前位置: 首页 > 知识库问答 >
问题:

如何在java递归过程中以整数形式保存数据

王庆
2023-03-14

我想写一个接收数字的递归方法。该方法应返回第二个数字,该数字仅由第一个参数中可被第二个参数整除的数字组成。

例如,如果使用number=5369405和digit=5调用该方法,则它应该返回505。

到目前为止,我已经编写了以下方法,但它不起作用,因为索引保持在-1,我想在每次递归期间保存它的值。我的想法是保存值以构造返回的数字。

有人能告诉我如何在每次递归期间保存索引以防止它返回-1吗?

这是我编写的代码:

public static int subNumber(int num, int digit)
{
    int index=-1;
    if(num <10)
    {  
        if(num%digit==0){
            index++;
            return num*(int)Math.pow(10,index);
            
        }
        else{
            return 0;
        }
    }
    int mod=(num%10);
    if(mod % digit ==0)
    {
        index++;
        return mod*(int)Math.pow(10,index)+subNumber(num/10,digit);
        
    }
    else{
        return 0+subNumber(num/10,digit);
    }
}

共有1个答案

黄正浩
2023-03-14

正如@markspace在评论中所建议的,您还应该向方法传递一个索引,以跟踪每个可除数字的位置,以便正确计算它们在最终数字中的权重。

此外,在设计递归方法时,您应该首先确定基本情况。在这种情况下,您的基本情况是:

>

传递的数字等于要除以的数字。

此外,用户可以传递不一致的索引(除了零之外的任何内容)。通常在这些情况下,当用户应该传递仅用于帮助您进行递归计算的参数时,您应该隐藏实际的递归方法并仅提供它的客户端版本。基本上,这个客户端版本只调用具有正确参数的正确递归方法,以避免误用。

public static int subNumber(int num, int digit, int index) {
    //Base case where no digits are divisible by digit
    if (num < digit) {
        return 0;
    }

    //Base where num corresponds to digit and therefore is divisible
    if (num == digit) {
        return num * ((int) Math.pow(10, index));
    }

    //Retrieving the less significant digit
    int modDigit = (num % 10);

    //If the current mod digit is divisible by digit then its i-th position is defined and the later call results are added to it
    if (modDigit % digit == 0) {
        return modDigit * ((int) Math.pow(10, index)) + subNumber(num / 10, digit, index + 1);
    }

    //Proceeding with the recursion without adding a value to sum (conceptually should be return 0 + subNumber(...))
    return subNumber(num / 10, digit, index);
}
public static int subNumberClient(int num, int digit){
    return subNumber(num, digit, 0);
}

private static int subNumber(int num, int digit, int index) {
    //same implementation but with private access modifier
}
 类似资料:
  • 我有多个文本框,当用户在不同的文本框中键入时,我希望有一个存储所有格式化数据的数组。 格式化的数据以 m:ss 为单位(m - 分钟,s - 秒) 现在,所有不同的文本框都显示相同的值,因为只有一个this.formatTime. 我们如何改变这一点,以便v-model遍历数组,并将其添加到格式化值数组中? 文本框应显示格式化的值,并将其存储在所有格式值[]中。 我真的被困在这个,谢谢你的时间!

  • 问题内容: 是否可以通过java的辅助函数保留信息,而无需使用静态变量。 例如, 也就是说,我想更新变量v而不丢失每个递归情况的信息,而不必访问函数外部的变量。 问题答案: 忘记所有告诉您声明属性或在每次递归调用中更新可变对象的答案。在真正的功能性递归样式中,您可以通过将信息作为参数和/或返回类型传递来“保留”信息。 让我用一个简单的示例进行说明,假设您要递归地计算中的元素之和。在这里, 状态 (

  • 我正在研究一个函数,它使用递归调用将给定的输入分解为面值。 在每个步骤中,它都会递归为两个变量: 继续当前的硬币:将其添加到列表中并递归。 切换到下一个硬币:递增硬币pos和递归。 除了在剩余=0时打印列表中捕获的面额组合之外,我还打算捕获该列表的值并从函数返回它。 这是代码: 输出:[5,5,3]

  • 问题内容: 我有下表: 现在,我需要一个mysql中的存储过程,该存储过程以递归方式调用自身并返回计算出的数量。例如,id 6有5个父级,而3个父级又有2个父级。因此,我需要计算(= 240)作为结果。 我对存储过程还很陌生,将来我不会经常使用它们,因为我更喜欢在程序代码中而不是在数据库中使用业务逻辑。但是在这种情况下,我无法避免。 也许mysql专家(就是您)可以在几秒钟内破解一条工作语句。 问

  • 问题内容: 我有功能 如何以非递归方式重写它?也许是实现某种算法? 问题答案: 不是完全O(1),但绝对不是递归的。

  • 我知道使用Wireshark和VLC保存RTP h264流是可能的。但为了学习更多关于视频流,我正在尝试自己做。有几个相关的问题有助于阅读这个主题: 如何处理原始UDP数据包,以便directshow源筛选器中的解码器筛选器对其进行解码 如何将H.264 UDP数据包转换为可播放的媒体流或文件(碎片整理) 以这些为背景,我目前的工作如下: 我可以通过UTP接收RTP数据包。 我按照上面问题中的讨论