Я написал рекурсивную функцию, которая берет массив положительных целых чисел (> 0) (denominations
) и целочисленное значение (amount
) и возвращает количество способов, с помощью которых можно получить значение, используя только целые числа в массиве. Так, например, массив целых чисел можно рассматривать как изменение и целочисленное значение как сумму денег, которую вы должны заплатить. И функция возвращает количество способов оплаты кассира. Например:Сложность времени нетривиальной рекурсивной функции
amount
= 4 и denominations
= [1,2,3,4]
Это должно вернуть 5
Я проверил свою функцию и она отлично работает. При вызове функции, аргументы acc
и index
передаются как 0. Вот функция:
public int count_number_of_ways(int amount, int acc, int index, int[] denominations) {
if (acc > amount) return 0;
if (amount == acc) return 1;
int len = denominations.length;
int count = 0;
while (acc < amount) {
for (int i = index + 1; i < len; i++) {
count += count_number_of_ways(amount, acc + denominations[i], i, denominations);
}
acc += denominations[index];
if (acc > amount) return count + 0;
if (acc == amount) return count + 1;
}
return count + 0;
}
Я пытался вычислить временную сложность этой функции, но врезался в кирпичную стену. Рекурсивный вызов находится внутри цикла for, который находится внутри цикла while, и это создавало для меня что-то непонятное. Может ли кто-нибудь помочь мне определить временную сложность для этой функции?
Я не думаю, что вы полностью протестирована код. Например, он работает неправильно с 'amount' = 6 и' denominations' = [1,2,3]. – rsutormin
@rsutormin Спасибо, что указали это. Я редактировал код. Должен работать сейчас. – Haider
Если вы не ограничиваете свои деноминации целыми значениями _positive_, ваш алгоритм никогда не остановится (т. Е. Если один из 0 или отрицательный, цикл ядра никогда не заканчивается). –