Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Рекурсия для вычисления последовательности - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Рекурсия для вычисления последовательности
Александр Дата: Вторник, 20.05.2014, 20:39 | Сообщение № 1
Группа: Гости
Дан ряд F = F(n - 1) + (x / ((F(n - 1)) ^ (k - 1)) - F(n - 1)) / k
В нем X и K известны начальное приближение F0=1, Условие остановки abs(F(n-1)-F(n))<0.0001
Надо решить рекурсией, циклом я решил.
Так для сведения, это ряд для нахождения корня из числа.

Вот что я накидал,но чет не работает, помогите пожалуйста

Sub Test()
x = 4
k = 2
Cells(10, 10) = F(n)
End Sub
Function F(n As Integer) As Double
If n = 0 Then
F = 1
Else
F = F(n - 1) + (x / ((F(n - 1)) ^ (k - 1)) - F(n - 1)) / k
End If
End Function
 
Ответить
СообщениеДан ряд F = F(n - 1) + (x / ((F(n - 1)) ^ (k - 1)) - F(n - 1)) / k
В нем X и K известны начальное приближение F0=1, Условие остановки abs(F(n-1)-F(n))<0.0001
Надо решить рекурсией, циклом я решил.
Так для сведения, это ряд для нахождения корня из числа.

Вот что я накидал,но чет не работает, помогите пожалуйста

Sub Test()
x = 4
k = 2
Cells(10, 10) = F(n)
End Sub
Function F(n As Integer) As Double
If n = 0 Then
F = 1
Else
F = F(n - 1) + (x / ((F(n - 1)) ^ (k - 1)) - F(n - 1)) / k
End If
End Function

Автор - Александр
Дата добавления - 20.05.2014 в 20:39
Alex_ST Дата: Вторник, 20.05.2014, 22:15 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Пользуйтесь тэгами оформления кодов процедур
[vba]
Код
Sub Test()
        x = 4
        k = 2
        Cells(10, 10) = F(n)
End Sub
Function F(n As Integer) As Double
        If n = 0 Then
            F = 1
        Else
            F = F(n - 1) + (x / ((F(n - 1)) ^ (k - 1)) - F(n - 1)) / k
        End If
End Function
[/vba]
Если бы Вы не пренебрегали рекомендациями учителей-основателей о желательности (по крайней мере на первых порах обучения) задания в модулях декларации Option Explicit, обязывающей объявлять переменные, то сразу бы поняли, что функция у Вас просто не корректно вызывается из процедуры Test.
Ведь в Sub Test аргумент n у Вас не определён, поэтому, вызываемая в строке Cells(10, 10) = F(n) функция считает его по умолчанию n=0 (т.к. ей указано, что аргумент n As Integer ).
Ну и , естественно, сразу же принимает значение 1 и никакой рекурсии не происходит.
Да и параметры х и k Вы функции не передаёте, поэтому они тоже считаются по умолчанию =0 со всеми вытекающими последствиями



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 20.05.2014, 22:49
 
Ответить
СообщениеПользуйтесь тэгами оформления кодов процедур
[vba]
Код
Sub Test()
        x = 4
        k = 2
        Cells(10, 10) = F(n)
End Sub
Function F(n As Integer) As Double
        If n = 0 Then
            F = 1
        Else
            F = F(n - 1) + (x / ((F(n - 1)) ^ (k - 1)) - F(n - 1)) / k
        End If
End Function
[/vba]
Если бы Вы не пренебрегали рекомендациями учителей-основателей о желательности (по крайней мере на первых порах обучения) задания в модулях декларации Option Explicit, обязывающей объявлять переменные, то сразу бы поняли, что функция у Вас просто не корректно вызывается из процедуры Test.
Ведь в Sub Test аргумент n у Вас не определён, поэтому, вызываемая в строке Cells(10, 10) = F(n) функция считает его по умолчанию n=0 (т.к. ей указано, что аргумент n As Integer ).
Ну и , естественно, сразу же принимает значение 1 и никакой рекурсии не происходит.
Да и параметры х и k Вы функции не передаёте, поэтому они тоже считаются по умолчанию =0 со всеми вытекающими последствиями

Автор - Alex_ST
Дата добавления - 20.05.2014 в 22:15
Alex_ST Дата: Вторник, 20.05.2014, 22:34 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Вот так попробуйте:[vba]
Код
Sub Test()
     Dim n As Integer, x As Integer, k As Integer
     x = 4
     k = 2
     n = 3
     'Cells(10, 10) = F(n, x, k)
     Debug.Print F(n, x, k)
End Sub
Function F(n As Integer, x As Integer, k As Integer) As Double
     If n = 0 Then
         F = 1
     Else
         F = F(n - 1, x, k) + (x / ((F(n - 1, x, k)) ^ (k - 1)) - F(n - 1, x, k)) / k
     End If
End Function
[/vba]Хотя я рекурсии и не очень люблю.



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеВот так попробуйте:[vba]
Код
Sub Test()
     Dim n As Integer, x As Integer, k As Integer
     x = 4
     k = 2
     n = 3
     'Cells(10, 10) = F(n, x, k)
     Debug.Print F(n, x, k)
End Sub
Function F(n As Integer, x As Integer, k As Integer) As Double
     If n = 0 Then
         F = 1
     Else
         F = F(n - 1, x, k) + (x / ((F(n - 1, x, k)) ^ (k - 1)) - F(n - 1, x, k)) / k
     End If
End Function
[/vba]Хотя я рекурсии и не очень люблю.

Автор - Alex_ST
Дата добавления - 20.05.2014 в 22:34
Alex_ST Дата: Вторник, 20.05.2014, 22:44 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Проверил в пошаговом режиме.
Вот так меньше циклов, т.к. в случае Else проходит одно рекурсивное вычисление для вычисления F(n-1), а не три, дающих один и тот же результат.
[vba]
Код
Sub Test()
     Dim n As Integer, x As Integer, k As Integer
     x = 4
     k = 2
     n = 3
     'Cells(10, 10) = F(n, x, k)
     Debug.Print F(n, x, k)
End Sub
Function F(n As Integer, x As Integer, k As Integer) As Double
     Dim Fn
     If n = 0 Then
         F = 1
     Else
         Fn = F(n - 1, x, k)
         F = Fn + (x / ((Fn) ^ (k - 1)) - Fn) / k
     End If
End Function
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеПроверил в пошаговом режиме.
Вот так меньше циклов, т.к. в случае Else проходит одно рекурсивное вычисление для вычисления F(n-1), а не три, дающих один и тот же результат.
[vba]
Код
Sub Test()
     Dim n As Integer, x As Integer, k As Integer
     x = 4
     k = 2
     n = 3
     'Cells(10, 10) = F(n, x, k)
     Debug.Print F(n, x, k)
End Sub
Function F(n As Integer, x As Integer, k As Integer) As Double
     Dim Fn
     If n = 0 Then
         F = 1
     Else
         Fn = F(n - 1, x, k)
         F = Fn + (x / ((Fn) ^ (k - 1)) - Fn) / k
     End If
End Function
[/vba]

Автор - Alex_ST
Дата добавления - 20.05.2014 в 22:44
MCH Дата: Вторник, 20.05.2014, 22:55 | Сообщение № 5
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

Алексей,
Цитата Александр, 20.05.2014 в 20:39, в сообщении № 1
Условие остановки abs(F(n-1)-F(n))<0.0001

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

Если запустить предложенный код при n=20, то расчетов можно не дождаться
для ускорения расчетов функцию для F(n-1) лучше вычислять один раз, а не три
[vba]
Код
Function F(n As Integer, x As Integer, k As Integer) As Double
     Dim F1 As Double
     If n = 0 Then
         F = 1
     Else
         F1 = F(n - 1, x, k)
         F = F1 + (x / (F1 ^ (k - 1)) - F1) / k
     End If
End Function
[/vba]
 
Ответить
СообщениеАлексей,
Цитата Александр, 20.05.2014 в 20:39, в сообщении № 1
Условие остановки abs(F(n-1)-F(n))<0.0001

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

Если запустить предложенный код при n=20, то расчетов можно не дождаться
для ускорения расчетов функцию для F(n-1) лучше вычислять один раз, а не три
[vba]
Код
Function F(n As Integer, x As Integer, k As Integer) As Double
     Dim F1 As Double
     If n = 0 Then
         F = 1
     Else
         F1 = F(n - 1, x, k)
         F = F1 + (x / (F1 ^ (k - 1)) - F1) / k
     End If
End Function
[/vba]

Автор - MCH
Дата добавления - 20.05.2014 в 22:55
Alex_ST Дата: Вторник, 20.05.2014, 23:02 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Вот так меньше циклов, т.к. в случае Else проходит одно рекурсивное вычисление для вычисления F(n-1), а не три, дающих один и тот же результат.

при n=20, то расчетов можно не дождаться
для ускорения расчетов функцию для F(n-1) лучше вычислять один раз, а не три

Миш, я раньше поправил свой первый код :)

А в условие задачи я даже и не смотрел, честно говоря.
Думал, что в своём коде топик-стартер все условия учёл, только не верно вызывал процедуру.
Думать как сделать выход лень.
Опять мы с тобой совпали во мнениях:
я рекурсии и не очень люблю

не люблю я рекурсии



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Вот так меньше циклов, т.к. в случае Else проходит одно рекурсивное вычисление для вычисления F(n-1), а не три, дающих один и тот же результат.

при n=20, то расчетов можно не дождаться
для ускорения расчетов функцию для F(n-1) лучше вычислять один раз, а не три

Миш, я раньше поправил свой первый код :)

А в условие задачи я даже и не смотрел, честно говоря.
Думал, что в своём коде топик-стартер все условия учёл, только не верно вызывал процедуру.
Думать как сделать выход лень.
Опять мы с тобой совпали во мнениях:
я рекурсии и не очень люблю

не люблю я рекурсии

Автор - Alex_ST
Дата добавления - 20.05.2014 в 23:02
MCH Дата: Вторник, 20.05.2014, 23:05 | Сообщение № 7
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

циклами задача решается так:
[vba]
Код
Sub test2()
         Dim x#, k#, eps#, f#, f0#
         x = 1225
         k = 2
         eps = 0.0001
         f = 1
         Do
             f0 = f
             f = f0 + (x / f0 ^ (k - 1) - f0) / k
         Loop Until Abs(f - f0) < eps
         Debug.Print f
End Sub
[/vba]
а вот так можно сделать на рекурсиях
[vba]
Код
Sub test3()
        Debug.Print f(1, 1225, 2, 0.001)
End Sub

Function f#(f0#, x#, k#, eps#)
        Dim fn#
        fn = f0 + (x / f0 ^ (k - 1) - f0) / k
        If Abs(fn - f0) < eps Then f = fn Else f = f(fn, x, k, eps)
End Function
[/vba]

Миш, я раньше поправил свой первый код

когда писал, не видел поправок. Наверно я слишком долго формулирую мысли
 
Ответить
Сообщениециклами задача решается так:
[vba]
Код
Sub test2()
         Dim x#, k#, eps#, f#, f0#
         x = 1225
         k = 2
         eps = 0.0001
         f = 1
         Do
             f0 = f
             f = f0 + (x / f0 ^ (k - 1) - f0) / k
         Loop Until Abs(f - f0) < eps
         Debug.Print f
End Sub
[/vba]
а вот так можно сделать на рекурсиях
[vba]
Код
Sub test3()
        Debug.Print f(1, 1225, 2, 0.001)
End Sub

Function f#(f0#, x#, k#, eps#)
        Dim fn#
        fn = f0 + (x / f0 ^ (k - 1) - f0) / k
        If Abs(fn - f0) < eps Then f = fn Else f = f(fn, x, k, eps)
End Function
[/vba]

Миш, я раньше поправил свой первый код

когда писал, не видел поправок. Наверно я слишком долго формулирую мысли

Автор - MCH
Дата добавления - 20.05.2014 в 23:05
Александр Дата: Вторник, 20.05.2014, 23:53 | Сообщение № 8
Группа: Гости
Спасибо огромное, понял свою ошибку, да я сам рекурсии не люблю, но вот задание такое, а циклом я сам быстро сделал)))
 
Ответить
СообщениеСпасибо огромное, понял свою ошибку, да я сам рекурсии не люблю, но вот задание такое, а циклом я сам быстро сделал)))

Автор - Александр
Дата добавления - 20.05.2014 в 23:53
Alex_ST Дата: Среда, 21.05.2014, 08:26 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
[offtop] off_top
когда писал, не видел поправок. Наверно я слишком долго формулирую мысли
Михаил, я же слово "пишу" в прошедшем времени не просто так пишу с заглавной А - "писАл" :)
Дабы не было разночтений и кривотолков. А то иногда очень двусмысленно звучит и надо мной как-то давно на одном из форумов поглумились [/offtop]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение[offtop] off_top
когда писал, не видел поправок. Наверно я слишком долго формулирую мысли
Михаил, я же слово "пишу" в прошедшем времени не просто так пишу с заглавной А - "писАл" :)
Дабы не было разночтений и кривотолков. А то иногда очень двусмысленно звучит и надо мной как-то давно на одном из форумов поглумились [/offtop]

Автор - Alex_ST
Дата добавления - 21.05.2014 в 08:26
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!