Есть раздел книги, который я использую для изучения c ++, где рассказывается об оптимизации функций.
Код выглядит следующим образом:
#include <iostream>
using namespace std;
int computeFactorials(int, int);
int factorial(int);
int main() {
computeFactorials(1, 5);
return 0;
}
int computeFactorials(int num, int max) {
cout << "Factorial of " << num << ": ";
cout << factorial(num) << endl;
num++;
if(num > max)
return 0;
else
computeFactorials(num, max);
}
int factorial(int n) {
int result;
if (n == 1)
result = 1;
else
result = (factorial(n-1) * n);
return result;
}
Вот выполнение программы:
Factorial of 10: 3628800
C:\MyPrograms\c++ optimize.cpp -o optimize.exe
C:\MyPrograms>optimize
Factorial of 1: 1
Factorial of 2: 2
Factorial of 3: 6
Factorial of 4: 24
Factorial of 5: 120
Я могу проследить до num == 3, но когда дело доходит до 4, моя логика не складывается с результатами. Я читаю код так:
computeFactorials(1,5)
, 1 означает число, с которого нужно начать, и 5 означает максимальное количество циклов. Я собираюсь начать с 3 как такового, потому что я понимаю 1 и 2 как число.
«Факториал» (3): factorial(3)
, затем в факториальной функции 3 вычитается 1 равным 2, а затем умножается на 3 для результата 6.
Однако, когда программа получает значение num, равное 4, это больше не имеет смысла. Потому что результат int функций factorials () должен быть равен 12, а не 24.
else result = (factorials (4-1) * 4) ;
3 * 4 = 12, а не 24. Как эта программа достигает 24, а не 12? Затем снова сделайте то же самое для num = 5, получив 120, а не 20.
Пожалуйста, помогите мне понять, я все еще очень nooby на этом языке, спасибо. 🙂
затем в факториальную функцию 3 вычитается 1, равный 2, а затем умножается на 3 для результата 6
Нет.
В факториальной функции 3 «вычитается из 1», равного 2, затем это 2 передается в factorial
в рекурсивном вызове:
factorial(2) * 3
= factorial(1) * 2 * 3
= 1 * 2 * 3
= 6
Результатом этого вызова является то, что умножается на 3 для результата 6.
Это (factorial(n-1) * n)
не ((n-1) * n)
,
Однако, когда программа получает значение num, равное 4, это больше не имеет смысла, потому что результат int функций factorials () должен быть равен 12, а не 24.
Если factorial(3)
6, то factorial(4)
явно не может быть только 12, потому что это только в два раза 6. Это недостаточно выросло.
factorial(3) * 4
= factorial(2) * 3 * 4
= factorial(1) * 2 * 3 * 4
= 1 * 2 * 3 * 4
= 24
3 * 4 = 12, а не 24
Правильно, но это не 4 факториала. 4 факториал равен 1 * 2 * 3 * 4.
Я подозреваю, что вы наполовину сбиты с толку факториал с последовательность Фибоначчи.
Других решений пока нет …