2016-09-22 3 views
0

Последовательность, которую я пытаюсь достичь, похожа на Fibonacci, но вместо N-го числа N-1 + N-2 мы имеем значение K, а N-й номер будет N-1 + N-2 + ... + N-K.Как написать программу C для последовательности Фибоначчи без векторов/рекурсии?

Я хочу написать программу C для записи последовательности до N-го номера с K и N в качестве входных данных. Он НЕ ДОЛЖЕН использовать векторы или рекурсию.

Update:

Там нет никакого возможного решения, это было упражнение, чтобы доказать необходимость вектора (массива) в решении некоторых проблем.

+3

Какие векторы? В C нет векторов ... Используйте цикл. –

+2

@EugeneSh .: В контексте довольно ясно (по крайней мере для меня), что «вектор» используется как другое имя для массива. Большинство моих старых профессоров CS имели математические степени и использовали термин «вектор» для 1D-массивов в Fortran и C. В основном, заявление о проблеме запрещает использование массивов в качестве промежуточного хранилища. –

+0

Это исключает любой массив или только массив для хранения полной последовательности? I.e., является рабочим массивом для допустимых значений «K»? – LutzL

ответ

0

Нет никакого реального ответа, поскольку это был вопрос о мертвецах.

1

Вам нужно какое-то хранилище для (по крайней мере) предыдущих значений K, и я полагаю, что суть вашего вопроса заключается в том, что вы можете использовать для этого.

Вы не можете использовать параметры стека/функции вызова, потому что вы не должны рекурсивно. Вы не можете использовать «вектор», по которому, я полагаю, вы имеете в виду массив. Было бы крайне беспорядочно использовать отдельные локальные переменные, и это было бы совершенно невозможно сделать, если бы не была очень низкая граница значений K. Единственными альтернативами, которые я вижу, являются

  1. Некоторые ароматы связанного списка. (Но будьте осторожны - связанный список может считаться «вектором» в очень свободном смысле этого термина.)
  2. Внешний файл. (Yuck!)

Вероятно, это упражнение связано с тем, что вы изучали в классе, чтобы дать вам понять, что имеет в виду преподаватель.

Я оставляю фактическую реализацию как упражнение, которым оно является.

+0

Это не может быть внешний файл, так как мы еще не узнали его. В первом варианте мне не нужно вручную записывать список для каждого значения K? Это не будет работать, так как K может быть любым целым числом. – emiliopedrollo

+0

@emiliopedrollo, нет, вам не нужно было бы писать отдельный список для каждого значения 'K'. Наличие гибкой длины является одной из основных характеристик связанного списка. Вам понадобится только одна реализация списка, если вы примете такой подход - вам просто нужно применить ее к своей проблеме соответствующим образом. –

+0

Итак, связанный список - это подход с использованием указателя? Ну, мы еще не видели этого в классе, поэтому я предполагаю, что это не намеренное решение. К настоящему моменту я начинаю думать, что нет никакого способа сделать это. – emiliopedrollo

1

Отказ от ответственности - это не, повторяю НЕ, что ваш профессор ищет, но ...

Если вы знаете, как решить recurrence relations, вы могли бы найти замкнутую форму из отношение для каждого значения K и просто вычислить, что (нет цикла, без хранения промежуточных значений). Например, п-й Фибоначчи число может быть вычислена с помощью функции

long double fib_closed(unsigned int n) 
{ 
    long double sqrt_5 = sqrtl(5.0); 
    long double phi = (1 + sqrt_5)/2.0; 
    long double psi = (1 - sqrt_5)/2.0; 

    return floorl((powl(phi, n) - powl(psi, n))/sqrt_5); 
} 

В вашем случае, вы бы иметь различное рекуррентное соотношение для каждого K (то есть, рекуррентное соотношение для N- 1 + N-2 + N-3 будет отличаться от рекуррентного отношения для N-1 + N-2 + N-3 + N-4 и т. Д.), Поэтому вам нужно будет написать столько функций, сколько значений K вы хотите использовать:

switch(K) 
{ 
    case 3: return f_closed_3(n); break; 
    case 4: return f_closed_4(n); break; 
    ... 
} 

, который, думая об этом, не собирается быть те крайне практично. Опять же, это не, что ваш профессор ищет, но это может сделать интересное упражнение в будущем.

+0

Таким образом, мне нужно будет найти/написать отношение для каждого значения K, которое колеблется от 1 до положительной бесконечности. Так что это невозможно. – emiliopedrollo

Смежные вопросы