Рекурсия и неизменность - PullRequest
       16

Рекурсия и неизменность

1 голос
/ 17 октября 2011

У меня самое сложное время, чтобы заставить мой класс работать правильно.Это класс натуральных чисел с такими методами, как увеличение и уменьшение.Я пытаюсь сделать его неизменным, и я застрял.Если я увеличиваю число таким образом, чтобы его младшая цифра не равнялась 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();
    }
}

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Я немного сбит с толку относительно порядка байтов вашего BigNatural.Вы явно не упоминаете, как храните свой номер.Вы можете сохранить сначала самую старшую цифру или сначала младшую цифру.

То есть число 12 345 можно сохранить как {1,2,3,4,5} (Big Endian) или {5, 4,3,2,1} (Little Endian).

Если ваш шаг верен, то получение 7 от прибавления 1 к 69,999, вероятно, является проблемой с порядком байтов.

То есть {7,0,0,0,0} равно 70 000, если Big Endian, или 7, если Little Endian.Проверьте строковый конструктор.Посмотрите, какой порядок байтов он ожидает.

1 голос
/ 17 октября 2011

Проблема в else. Вы должны составить число после приращения:

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

        return new SlowBigNatural(addElement(incremented.natural, 0), nSize + 1);
    }



private int[] addElement(int[] arr, int element) {
      int[] copy = new int[arr.length+1];
      for (int index = 0; index < arr.length+1; index++){
            copy[index] = arr[index-1];
      }
      copy[arr.length] = element;
      return copy;
   }
...