Невозможно создать правильный N Выберите метод R - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть это задание для написания Java-кода:

С учетом набора из n элементов, сколько способов мы можем выбрать r элементов из n?Это известно как «функция выбора» (или биномиальный коэффициент), и мы можем вычислить число подмножеств r-размера n (где порядок не важен), используя рекуррентное соотношение, определенное ниже.Обратите внимание, что это определение основывается на понятии факториала, поэтому убедитесь, что вы сначала поняли пример кода и создали рабочий метод факториала, прежде чем переходить к. C (n, r) = n!/ (r! * (nr)!)

Я полностью понимаю, как работает самая простая форма факторной рекурсии, но пока мой код такой:

    public static int NChooseR(int n, int r)
        {
            if( n == 1 || r == 1)
                return 1;
            else
                return (n * NChooseR( n - 1, r)/ n * NChooseR ((n-r) - 1, r) );
        }

Так, например, еслимои входные данные были 5 для n и 3 для r, этот метод должен возвращать 10. Я пытаюсь выяснить, как написать этот метод по частям, так что код, который у меня сейчас есть, должен распечатать 60, потому что (n * NChooseR (n - 1, r) должен быть факториалом 5, равным 120, а n * NChooseR ((nr) - 1 должен быть факториалом 5 - 3, который фактически является факториалом 2, равным 2, но я получаю ошибку переполнения стека. I 'Я пробовал много других вещей, и я дошел до того, что просто смотрю на свой код, пробуя разные вещи безрезультатно. Если кто-то может ответить на этот вопрос, вы можете объяснить это так, как будто мне 5 лет, потому что пока нет информациив Интернете мне помогли, и я очень расстроен, и я не знаю, куда идти отсюда.

1 Ответ

0 голосов
/ 18 февраля 2019

Первый: начальные значения неверны для r=1, начиная с C(n,1) = n!/(n-1)! = n.
Должно быть r=0, начиная с C(n,0) = 1


Второе: используйте эту повторяющуюся формулу
C(n,r) = C(n-1,r) + C(n-1,r-1)

n, в конце r переходит к 1,0и идентифицируется с предварительно рассчитанными начальными значениями C(1,0) = 1 и C(n,0) = 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...