дополнительное задание: оформите решение в виде функции, принимающей в качестве аргумента $N - номер числа последовательности, который должен быть выведен на экран. (желательно при этом выводить на экран и всю последовательность в целях наглядности результата)
Читайте условие внимательнее: на экране должен быть результат - N-ное число последовательности. Только одно число. Вы выводите всю последовательность. Можете выводить, для оценки корректности работы это даже хорошо. Но где результат?
Почитал что последовательность Фибоначчи может быть еще и отрицательной, но решил пока дать такое решение, чтобы понять в ту ли сторону я двигаюсь, если да - реализую с отрицательными значениями последовательности...
да, повторяется, но не везде! При первом условии мы проверяем значение n=0 и f1 и f2 вообще не выводятся, дальше мы проверяем n=1, тогда выводится только f1, дальше n=2 и только здесь начинается вывод как f1 так и f2, и при n=3 выводятся все остальные значения
Мне кажется что выносить f1 и f2 не совсем целесообразно, либо, я просто не знаю как это сделать... подскажите!
По возможности лучше избегать повторяющегося кода. Есть различные способы это сделать, начиная выделением повторяющегося фрагмента в отдельную функцию, и заканчивая наследованием и трейтами.
да, повторяется, но не везде!
И всё же я предлагаю выводить первые два числа последовательности всегда, даже если требуется найти 0 или 1 элемент. Это не так важно, т.к. вывод последовательности нужен только для отладки. В реальной программе после разработки мы его вообще удалим.
Всегда держите в голове, какой конкретно должен быть результат в задаче.
Какой у нас должен быть результат?
N-ное число последовательности: такое-то
О том, сколько чисел последовательности выведено на экран, ничего не сказано. Мы выводим последовательность чисто для того, чтобы можно быть посчитать пальчиком, правильно ли решено. Вот если бы Вы вывели меньше цифр последовательности, чем искомое, я бы Вам сказала:
А как я посчитаю? Выведите-ка побольше. Как я результат проверю?
Да, лишние данные тоже выводить ни к чему, но в данном случае, это скорее упростит нам задачу, чем усложнит. И на результат не повлияет.
Если хотите педантично подойти к выводу на экран, вынесите вывод первых двух элементов в отдельную функцию, и вызывайте там, где надо.
function fibonachiValue ($n)
{
function outputF1 ($a){
echo $a . '<br>';
}
function outputF1F2 ($a, $b){
echo $a . '<br>';
echo $b . '<br>';
}
// ...
}
Возвращаемся к области видимости. Если Вы объявили функции внутри функции, Вы не сможете использовать их нигде "снаружи". А вот если объявите снаружи, то сможете и там, и там. Поэтому так не делают. Вынесите это из функции.
function outputF1 ($a){
echo $a . '<br>';
}
В функции всего одна строчка кода. Выделение её отдельно себя не оправдывает абсолютно. Что так одна, что так - никакого сокращения.
Если уж Вы её создали, используйте свой код:
function outputF1F2 ($a, $b){
outputF1($a);
echo $b . '<br>';
}
function outputF1F2()
Неправильное название. f1 и f2 - это всего лишь названия переменных, которые ни о чём не говорят. Мало того, что они, кстати, тоже могли бы называться более информативно, так ещё и в название метода их вставили...
Это отдельная функция. Она делает НЕЧТО. И вот так и надо её назвать. Например, outputTwoStrings() или ещё конкретнее: outputTwoNumbersInColumn(). Самой функции всё равно, числа это Фибоначчи или календарь за 2018 год. Она печатает две строки в столбик.
Вы рассуждаете масштабами реальных проектов, в контексте того, что вот эта маленькая функция - это всего лишь небольшой функционал одного большого проекта и "захломлять" его не надо, от него требуется чтобы он просто правильно работал и все. Но поймите, для меня на текущий момент решение этой задачи и есть тот самый реальный большой проект, который я делаю. Да, я понимаю, где-то криво, где-то косо, но он мой... родной и он работает (конкретно в контексте этой задачи!). Безусловно та информация, которая Вы мне говорите - она очень ценная, основная ее ценность - это Ваш опыт, конечно же я очень и очень к ней прислушиваюсь и стараюсь делать все как надо, потому что Ваш опыт реализации реальных проектов говорит что "именно так, а не как иначе", потому что потом можно будет "заблудиться". Но ведь Вы тоже когда-то были на моем месте и я больше чем уверен в какой-то момент "заблудились" в одном из проектов и долго и мучительно искали решения тем самым нарабатывая свой опыт... Поэтому прошу Вас не судить меня строго, повторюсь Ваши советы очень ценны, спасибо Вам за них, но реального опыта я наберусь только при реализации реального проекта, всего же опыта не передашь и вот тогда, когда я пару раз "заблужусь" - я в очередной раз вспомню Вас и про себя скажу Вам огромное спасибо и продолжу искать выход из дебрей кода )))
Не принимайте близко к сердцу замечания. Ваше решение данной задачи, кстати, работало с самого начала. Вы молодец, всё неплохо понимаете, поэтому я дополнительное задание дала.
melisa
Mon, 10/15/2018 - 16:36
Permalink
хорошо
дополнительное задание: оформите решение в виде функции, принимающей в качестве аргумента $N - номер числа последовательности, который должен быть выведен на экран. (желательно при этом выводить на экран и всю последовательность в целях наглядности результата)
iov84
Thu, 10/18/2018 - 20:05
Permalink
решение
melisa
Fri, 10/19/2018 - 16:06
Permalink
читайте условие внимательнее
Читайте условие внимательнее: на экране должен быть результат - N-ное число последовательности. Только одно число. Вы выводите всю последовательность. Можете выводить, для оценки корректности работы это даже хорошо. Но где результат?
iov84
Sun, 10/21/2018 - 17:19
Permalink
очень интересная задачка...
Вуаля:
melisa
Mon, 10/22/2018 - 20:01
Permalink
вот теперь наглядно видно
программа работает некорректно:
Ваша основная задача: вывести конкретное число бесконечной последовательности. Дан его порядковый номер (числа).
$k не может быть случайным. См. п.1 Последовательность бесконечная.
можно использовать некое $k для вывода на экран части последовательности (с целью отладки), но как это может быть случайное число?
Зачем мы выводили последовательность? Чтобы можно было прямо на экране посчитать тот ли порядковый элемент выводится. Считаем. Не тот(
iov84
Wed, 10/24/2018 - 19:58
Permalink
исправился
Почитал что последовательность Фибоначчи может быть еще и отрицательной, но решил пока дать такое решение, чтобы понять в ту ли сторону я двигаюсь, если да - реализую с отрицательными значениями последовательности...
С нетерпением жду обратной связи!
melisa
Wed, 10/24/2018 - 20:15
Permalink
echo $f1 . '<br>';
Это повторяющийся код, вынесите его из конструкции if-else наружу
iov84
Thu, 10/25/2018 - 11:06
Permalink
вопрос...
Код
да, повторяется, но не везде! При первом условии мы проверяем значение n=0 и f1 и f2 вообще не выводятся, дальше мы проверяем n=1, тогда выводится только f1, дальше n=2 и только здесь начинается вывод как f1 так и f2, и при n=3 выводятся все остальные значения
Мне кажется что выносить f1 и f2 не совсем целесообразно, либо, я просто не знаю как это сделать... подскажите!
melisa
Thu, 10/25/2018 - 12:42
Permalink
по возможности лучше избегать повторяющегося кода
По возможности лучше избегать повторяющегося кода. Есть различные способы это сделать, начиная выделением повторяющегося фрагмента в отдельную функцию, и заканчивая наследованием и трейтами.
И всё же я предлагаю выводить первые два числа последовательности всегда, даже если требуется найти 0 или 1 элемент. Это не так важно, т.к. вывод последовательности нужен только для отладки. В реальной программе после разработки мы его вообще удалим.
Всегда держите в голове, какой конкретно должен быть результат в задаче.
Какой у нас должен быть результат?
О том, сколько чисел последовательности выведено на экран, ничего не сказано. Мы выводим последовательность чисто для того, чтобы можно быть посчитать пальчиком, правильно ли решено. Вот если бы Вы вывели меньше цифр последовательности, чем искомое, я бы Вам сказала:
Да, лишние данные тоже выводить ни к чему, но в данном случае, это скорее упростит нам задачу, чем усложнит. И на результат не повлияет.
Если хотите педантично подойти к выводу на экран, вынесите вывод первых двух элементов в отдельную функцию, и вызывайте там, где надо.
iov84
Thu, 10/25/2018 - 13:04
Permalink
готово
melisa
Thu, 10/25/2018 - 15:07
Permalink
ну сами напросились)
Возвращаемся к области видимости. Если Вы объявили функции внутри функции, Вы не сможете использовать их нигде "снаружи". А вот если объявите снаружи, то сможете и там, и там. Поэтому так не делают. Вынесите это из функции.
Неправильное название. f1 и f2 - это всего лишь названия переменных, которые ни о чём не говорят. Мало того, что они, кстати, тоже могли бы называться более информативно, так ещё и в название метода их вставили...
Это отдельная функция. Она делает НЕЧТО. И вот так и надо её назвать. Например, outputTwoStrings() или ещё конкретнее: outputTwoNumbersInColumn(). Самой функции всё равно, числа это Фибоначчи или календарь за 2018 год. Она печатает две строки в столбик.
Хотя я предлагала сделать проще ;)
iov84
Fri, 11/02/2018 - 13:31
Permalink
не судите строго!
Я все это понимаю, прекрасно понимаю!
Вы рассуждаете масштабами реальных проектов, в контексте того, что вот эта маленькая функция - это всего лишь небольшой функционал одного большого проекта и "захломлять" его не надо, от него требуется чтобы он просто правильно работал и все. Но поймите, для меня на текущий момент решение этой задачи и есть тот самый реальный большой проект, который я делаю. Да, я понимаю, где-то криво, где-то косо, но он мой... родной и он работает (конкретно в контексте этой задачи!). Безусловно та информация, которая Вы мне говорите - она очень ценная, основная ее ценность - это Ваш опыт, конечно же я очень и очень к ней прислушиваюсь и стараюсь делать все как надо, потому что Ваш опыт реализации реальных проектов говорит что "именно так, а не как иначе", потому что потом можно будет "заблудиться". Но ведь Вы тоже когда-то были на моем месте и я больше чем уверен в какой-то момент "заблудились" в одном из проектов и долго и мучительно искали решения тем самым нарабатывая свой опыт... Поэтому прошу Вас не судить меня строго, повторюсь Ваши советы очень ценны, спасибо Вам за них, но реального опыта я наберусь только при реализации реального проекта, всего же опыта не передашь и вот тогда, когда я пару раз "заблужусь" - я в очередной раз вспомню Вас и про себя скажу Вам огромное спасибо и продолжу искать выход из дебрей кода )))
Итого: задача принята?
melisa
Fri, 11/02/2018 - 13:43
Permalink
Не принимайте близко к сердцу
Не принимайте близко к сердцу замечания. Ваше решение данной задачи, кстати, работало с самого начала. Вы молодец, всё неплохо понимаете, поэтому я дополнительное задание дала.
А так, да, принято.
math2
Thu, 10/25/2018 - 15:37
Permalink
Лучше удалить здесь несколько
Лучше удалить здесь несколько строк.