2014-11-07 3 views
0

Я пытался в течение нескольких дней решить проблему с функцией Эйлера. я должен придумать тот, который работает следующим образом:Рекурсивный алгоритм Эйлера в C

float f_euler(int n) 
f_euler(0)=2 
f_euler(1)=2+ (2/2)=3 
f_euler(2)=2+ 2/(2+ 3/3)= 2.6666… 
f_euler(5)=2+ 2/(2+ 3/(3+ 4/(4+ 5/(5+6/6)))))= 2.7184… 

и т.д ...

Этот код на языке C.

Пожалуйста, примите во внимание! Я был бы очень рад, если бы кто-то помог мне, я в отчаянии! D:

Спасибо :)

Вопрос 1.1:

Я, наконец сделать это, но я Алгоритм Построения я не совсем уверен, если он будет работать:

п (п, I)

  • + 1, если я = п
  • 2, если я = 0 & & п = 0
  • 2+ (2/(е (г + 1)), если я = 0 & & п> 0
  • F ((I + 1) + ((г + 2)/е (г + 1))) если i> 0

Извините, если я не объясню себя четко, но я новичок на этом сайте.

Спасибо всем!

+2

Вы можете показать исходный код для 'f_euler'? То, что вы показываете здесь, не имеет смысла с точки зрения C. –

+0

Добро пожаловать в stackoverflow. Вы должны представить свою попытку, как можно задокументировано.Чем лучше вы показываете, что вы сделали, тем больше вам поможет. – Paul92

+0

Эта строка: 2+ 2/2 = 3 не является разумным кодом C. он говорит, чтобы сделать присвоение 2/2 (которое не является lvalue) со значением 3, Следующие строки имеют эту же проблему. Компилятор должен был вызвать предупреждение/ошибку и не смог скомпилировать файл. У вас есть все предупреждения/ошибки? в gcc параметр, такой как -Wall, поймал бы эту проблему. Вы игнорировали сообщения от компилятора? – user3629249

ответ

0

С точки зрения программирования, я думаю, вы приближаетесь к этому назад. Вместо того, чтобы рекурсировать внутрь, подумайте о том, чтобы начать снизу и вычислить вверх. Начиная с вашим примером:

float f_euler(int n) 
f_euler(0)=2 
f_euler(1)=2+ (2/2)=3 
f_euler(2)=2+ 2/(2+ 3/3)= 2.6666… 
f_euler(5)=2+ 2/(2+ 3/(3+ 4/(4+ 5/(5+6/6)))))= 2.7184… 

Мы можем переписать шаги f_euler(5) в серии обновлений

val = 6 
val = 5 + 6/val 
val = 4 + 5/val 
val = 3 + 4/val 
val = 2 + 3/val 
val = 1 + 2/val 

картина и как она должна перевести цикл должен быть намного понятнее от этого представления ,

Обратите внимание, что последняя строка должна быть 2 + 2/val, но вы можете добавить другую единицу перед возвратом; это более четко показывает структуру петли.

+0

Огромное спасибо, теперь я должен увидеть исключение первого взаимодействия и последнего. Но теперь я вижу это проще. – Armando

0

Попробуйте разлагать проблему в

Approximation = Starting approximation + Error Correction 

, то вы можете представить его recoursively в

Approximation(call N) = Approximation(call N - 1) + Error Correction 

И, наконец, написать функцию C, которая выглядит как

float approximation = getApproximation(oldApproximation, other items...); 

с исправлением ошибок может быть вычислено из «других статей»

+0

Это всего лишь промежуточный шаг. Но это необходимо, прежде чем вы сможете подойти к рекурсивной части, которая будет включать в себя включение функции аппроксимации в себя и добавление параметра «сколько раз для вызова». –

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