java - 递归和不变性

标签 java recursion immutability tail-recursion

我正在努力让我的类(class)正常工作。它是一个自然数类,具有增加和减少等方法。我试图让它不可变,但我被卡住了。如果我增加一个数字,使其最低有效数字不是 9,它就可以正常工作。但是一旦我遇到边界情况,它就失败了。

即。我有一个数字 69999,我将它递增,结果是 7。

private SlowBigNatural(int[] natural, int nSize){
    this.nSize = nSize - 1;
    this.natural = new int[this.nSize];
    for (int i = 0; i < this.nSize; i++) {
        this.natural[i] = natural[i];
    } 
}
@Override
public BigNatural increment() {
    int[] nClone = natural.clone();
    if (nSize == 1 || nClone[nSize - 1] != HIGHEST) {
        nClone[nSize - 1]++;
        String nString = "";
        for(int i = 0; i < nSize; i++){
            nString += String.valueOf(nClone[i]);
        }
        BigNatural nInc = new SlowBigNatural(nString);
        return nInc;
    } 

    else {
        nClone[nSize - 1] = 0;
        BigNatural temp = new SlowBigNatural(nClone, nSize);
        return temp.increment();
    }
}

最佳答案

我对 endianness 有点困惑你的 BigNatural。您没有明确提及您如何存储号码。您可以先存储最高有效数字,也可以先存储最低有效数字。

即数字 12,345 可以存储为 {1,2,3,4,5}(Big Endian)或 {5,4,3,2,1}(Little Endian)。

如果您的增量是正确的,那么从 69,999 加 1 得到 7 可能是字节顺序问题。

即 {7,0,0,0,0} 如果是大字节序则为 70,000,如果是小字节序则为 7。检查字符串构造函数。查看它期望的字节顺序。

关于java - 递归和不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7789458/

相关文章:

java - jit会优化新对象吗

java - Annotation 处理 unknown Annotation

java - 具有过期可能性的简单 Java 字符串缓存

c++ - 霍纳法则 C/C++ 使用递归

Java 递归计数参数

javascript - 如何使这个数组展平函数在 JavaScript 中递归运行?

java - JDBC 嵌套 while 循环

java - Kafka Stream Chained LeftJoin - 在新消息之后再次处理以前的旧消息

java - 从方法中的字符串到类中的字符串

java - 不可变数组的修改不起作用