Начните с самых простых случаев и ищите закономерности.
Train (1)
, очевидно, равно 1: (1).
Train (2)
, очевидно, равно 2: (1 1) и (2).
Train (3)
равно 3: (1 1 1), (1 2) и (2 1). Первые два можно объединить в (1) с (1 1) и (2). Последние являются именно комбинациями Train (2)
. Итак, Train (3)
есть Train (2) + 1
.
Train (4)
равно 5: (1 1 1 1) (1 1 2) (1 2 1) (2 1 1) (2 2). Опять же, мы можем объединить первое как (1) с (1 1 1), (1 2) и (2 1), которые являются комбинациями Train (3)
. К последним относятся (2), соединенные с (1 1) и (2), которые являются комбинациями Train (2)
. Итак, Train (4)
- это Train (3) + Train (2)
. Теперь, оглядываясь на Train (3)
, мы видим, что + 1
равен Train (1)
.
Теперь ясно, что Train (n)
всегда Train (n - 1) + Train (n - 2)
. Это и есть определение последовательности Фибоначчи.
Теперь давайте посмотрим, как это переводится на C.
Скелет функции: Train
принимает один целочисленный аргумент и возвращает целое число:
int Train (int n) {
}
Определение, которое мы разработали:
int Train (int n) {
return Train (n - 1) + Train (n - 2);
}
Это будет повторяться бесконечно, поэтому мы должны остановить его в базовом случае. Один базовый случай ясен: Train (1)
равно 1:
int Train (int n) {
if (n == 1) {
return 1;
} else {
return Train (n - 1) + Train (n - 2);
}
}
Этого все еще недостаточно. Представьте себе, что делает Train (2)
: он вычислит Train (1) + Train (0)
. Train (1)
не проблема, но Train (0)
вычислит Train (-1) + Train (-2)
, что снова повторяется бесконечно. Итак, нам нужен еще один базовый случай: Train (2)
равен 2.
int Train (int n) {
if (n == 1) {
return 1;
} else if (n == 2) {
return 2;
} else {
return Train (n - 1) + Train (n - 2);
}
}
Это работает, но мы можем упростить базовые случаи:
int Train (int n) {
if (n < 3) {
return n;
} else {
return Train (n - 1) + Train (n - 2);
}
}
Если вы сейчас просто вставите последний фрагмент кода в домашнее задание, не пройдя предварительные задания «слишком долго не читали», я успешно подорву ваше образование, и вы никогда не научитесь программировать. Добро пожаловать.
Это не лучший способ для вычисления чисел Фибоначчи. Зачем? Как вы должны изменить код, чтобы избежать дублирования усилий? Можно ли представить разные подходы? Какие?