Я создаю две функции, которые должны эмулировать и возвращать результат f (i) = 1/1 + 1/2 + 1/3 ... 1/я. Одна функция рекурсивна, и я проверяю, что рекурсивная функция функционирует правильно, реализуя нерекурсивную версию. Тем не менее, я обнаружил, что обе функции возвращают похожие ответы, которые не совсем то же самое. Может кто-нибудь объяснить, почему функции возвращают разные значения?Рекурсивная функция и нерекурсивная функция, возвращающая разные результаты
При запуске функции в основном методе класса, к которому они принадлежат, я получаю следующий вывод:
Рекурсивных за 1000: 7,485478 нерекурсивен за 1000: 7,4854717
Рекурсивных для 1: 1,0
нерекурсивна для 1: 1,0
рекурсивных для 483: 6,758268
нерекурсивна для 483: 6,758267
Вот мой код:
static float RecursiveFunction(int num){
//The num parameter represents the denominator that will be used
//The recursive function is continually called at lower increments of num
//If num is one, return 1 and do not call RecursiveFunction again
if (num == 1) {
return 1;
}
//Otherwise, return 1/num (in floating point decimal) and call RecursiveFunction with a parameter of num - 1
else {
return 1/(float)num + RecursiveFunction(num - 1);
}
}
//A Non-recursive version of RecursiveFunction that will be used to test RecursiveFunction
static float NonRecursiveFunction(int num) {
//The total variable adds up the fractions
float total = 0;
//While num is greater than zero, add 1/num to total and then subtract 1 from num
while (num > 0) {
total += 1/(float)num;
num -= 1;
}
return total;
}
Похож на проблемы округления из-за использования плавающих точек ... – assylias
Очень интересный вопрос. –
Вы должны использовать отладчик или регистратор, чтобы проверять каждое слагаемое на вопросы округления. – Smutje