Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
1

Рекурсивная функция суммирования

02.04.2016, 15:47. Показов 4524. Ответов 25
Метки нет (Все метки)

Приветствую, уважаемые специалисты. Прошу разъяснить пошагово: что такое РЕКУРСИЯ и каковы её основные принципы.
Просьба в Интернет не отправлять-я только что оттуда)
Я просто не могу осмыслить, как эта вещь работает.
Прилагаю мой файл, в котором необходимо вычислить сумму стоимости товаров (диапазон "Е2:Е11") при помощи рекурсивной ФУНКЦИИ.
Преподаватель сказал, что я подменил РЕКУРСИЮ ЦИКЛОМ. Не спорю, ибо не понимаю..
Поясните, пожалуйста.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вложения
Тип файла: xls 111.xls (84.5 Кб, 6 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2016, 15:47
Ответы с готовыми решениями:

функция суммирования двух массивов
Добрый день, Я только начинаю разбираться в VBA, поэтому прошу помощи. Есть два одномерных...

Рекурсивная функция
Создал рекурсивную функцию: Function getData(..., ParName() As Variant, ...) <код> ParName...

Рекурсивная функция не возвращает значение
Добрый день. Полтора часа пытаюсь решить простейшую задачу. Почему-то рекурсивная функция в Excel...

Рекурсивная функция: найти член последовательности, заданной формулой
Вывести через пробел значения рекурсивной функции при значениях аргумента от 1 до 10 включительно. ...

25
Заблокирован
02.04.2016, 17:08 2
Попробуйте, может прокатит -
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub сум()
''расчёт суммы стоимости товаров рекурсией
Dim y As Single
Dim i As Integer
[e12].Font.Color = 0
[e12].ClearContents
Cells(18, 8) = " РЕКУРСИЯ:"
Cells(13, 5).Font.Color = vbWhite
Cells(13, 5) = "=Sum(E2:E11)"
'For i = 2 To 11
'y = Summa(i)
'Next i
Cells(18, 9) = fSum([e2]) 'y
End Sub
Function fSum(rn As Range)
If rn Then fSum = rn + fSum(rn.Offset(1))
End Function
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
02.04.2016, 17:09  [ТС] 3
благодарю, но мне бы ещё разъяснить СУТЬ и ПРИНЦИП рекурсии и функции..
0
Заблокирован
02.04.2016, 17:21 4
Димми, очень сомневаюсь, что смогу расписать СУТЬ и ПРИНЦИП рекурсии и функции доходчивее, чем это сделано в справке и в куче учебников, коими завален ИНЕТ...
0
6848 / 2786 / 525
Регистрация: 19.10.2012
Сообщений: 8,493
02.04.2016, 18:28 5
Вообще я рекурсию не использую, т.к. если её много - можно получить переполнение стека.
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
02.04.2016, 18:46  [ТС] 6
Друзья мои, я лучше понимаю то, что мне объясняет человек, а не Инет.
Христом-богом прошу: ну на данном примере поясните-что,как и почему?)
0
Заблокирован
02.04.2016, 19:55 7
Цитата Сообщение от Димми Посмотреть сообщение
на данном примере поясните-что,как и почему?
F8 и Locals мне в свое время пояснили очень многое...
0
Миниатюры
Рекурсивная функция суммирования  
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
02.04.2016, 20:00  [ТС] 8
Я не могу постичь ГЛУБИННОЙ сути понятия рекурсии. Как что-то может вытаскивать само себя из болота за волосы?
0
1883 / 1283 / 608
Регистрация: 23.03.2015
Сообщений: 4,169
03.04.2016, 01:32 9

Не по теме:

Димми,
Давайте рассмотрим другую задачу....
Вычислим 5!
Т.е 1*2*3*4*5 , а можно записать и так:
1) 5*4*3*2*1 или
2) 5*4! где 4!=4*3! , а 3! =3*2! ну и далее 2!=2*1!
Можно сказать, что
у нас есть функция Y(x)=x! , для которой областью определения будет x>=0 и еще х - целые числа.
Запишем эту функцию для х=5
1)Y(5)=5! или
2)Y(5)=5*Y(4) где Y(4)=4*Y(3) ; Y(3)=3*Y(2) ; Y(2)=2*Y(1) ; Y(1)=1*Y(0)-это всегда равно 1

Для x=N будет Y(N)=N*Y(N-1) ; Y(N-1)=(N-1)*Y((N-1)-1) и т.д до N=1

попробуем написать это же самое в VBA
объявим функцию Y(x) ,где Х- целые числа , сл-но Y- тоже целое число (как произведение целых чисел)
Function Y(X As Integer) As Integer
Пропишем здесь, что она должна делать
1) Компьютер не понимает выражения 0! поэтому создадим условие - если х<0 то Y=1
if x<1 Then Y=1
а в остальных случаях Y(x)=x*Y(x-1)
Else
Y= x*Y(x-1)
End If




Действия компьютера :
1) x=5
2) X больше 0 сл-но Y=5*Y(4)
3) 4>1 https://www.cyberforum.ru/cgi-bin/latex.cgi?\Rightarrow Y=5*4*Y(3)
4) 3>1https://www.cyberforum.ru/cgi-bin/latex.cgi?\Rightarrow Y=5*4*3*Y(2)
5) 2>1 https://www.cyberforum.ru/cgi-bin/latex.cgi?\Rightarrow Y=5*4*3*2*Y(1)
5) 1=1 https://www.cyberforum.ru/cgi-bin/latex.cgi?\Rightarrow Y=5*4*3*2*1

Такой метод и называется рекурсией....
P.S Надеюсь, что объяснил...
0
6848 / 2786 / 525
Регистрация: 19.10.2012
Сообщений: 8,493
03.04.2016, 18:44 10
Можно померить у кого какой overflow
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub test()
    Dim x, t   As Integer
    For t = 1 To 100
        x = Y(t)
        MsgBox t & "-" & x
    Next
End Sub
 
Function Y(x As Integer) As Integer
'Пропишем здесь, что она должна делать
'1) Компьютер не понимает выражения 0! поэтому создадим условие - если х<0 то Y=1
    If x < 1 Then
        Y = 1
        'а в остальных случаях Y(x)=x*Y(x-1)
    Else
        Y = x * Y(x - 1)
    End If
End Function
у меня счастливое число 7
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
03.04.2016, 19:22  [ТС] 11
Друзья мои, я вам всем искренне благодарен, но всё равно...
Вот моё творение.
Visual Basic
1
2
3
4
5
6
7
Public Function Summa(n As Integer) As Single
If n < 2 And n > 11 Then
Summa = 0
Else
Summa = Summa + Cells(n + 1, 5)
End If
End Function
Преподаватель утверждает, что здесь ЦИКЛ вместо рекурсии.
Прошу пояснить:рекурсивная функция суммирования-КАК ЭТО и ЧТО ЭТО?
Не подумайте, что издеваюсь, но отдельные вещи в самом деле до меня туго доходят. Ну такой уж я..))
0
es geht mir gut
11483 / 4715 / 1180
Регистрация: 27.07.2011
Сообщений: 11,433
03.04.2016, 20:03 12
Цитата Сообщение от Димми Посмотреть сообщение
Преподаватель утверждает, что здесь ЦИКЛ вместо рекурсии
Он прав.
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
03.04.2016, 20:05  [ТС] 13
Покажите мне Христа ради пример рекурсивной функции суммирования. Для меня слово "рекурсия" звучит уже хуже чем "х...й"!)))
0
Заблокирован
03.04.2016, 20:07 14
Димми, Вам был дан первым же ответом рабочий вариант решения рекурсией.
Вам хором пытаются объяснить, что рекурсивная ф-ия должна сама себя вызывать.
Рекурсия начинает
Цитата Сообщение от Димми Посмотреть сообщение
вытаскивать само себя из болота за волосы
в тот момент,
когда пропадает условие для вызова (в нашем случае - пустая следующая ячейка)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Function fSum(rn As Range)
If rn Then 'если в ячейке что-то есть
  fSum = rn + fSum(rn.Offset(1)) 'fSum = эточтото + fSum(следующаяячейуа)
'                   Function fSum(rn As Range)
'                     If rn Then 'если в ячейке что-то есть
'                       fSum = rn + fSum(rn.Offset(1)) 'fSum = эточтото + fSum(следующаяячейка)
'                                         и т.д.  
'                      end if
'                    End Function
end if
End Function
Не знаю, как ещё объяснить.
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
03.04.2016, 20:10  [ТС] 15
Благодарю. Меня проще пристрелить в отдельных случаях)
А теперь вопрос-как у вас определяется диапазон?
0
Заблокирован
03.04.2016, 20:17 16
Цитата Сообщение от Димми Посмотреть сообщение
А теперь вопрос-как у вас определяется диапазон?
Диапазон (первая его ячейка) определялась здесь -
Visual Basic
1
13  Cells(18, 9) = fSum([e2])
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
03.04.2016, 20:19  [ТС] 17
А последняя?
0
es geht mir gut
11483 / 4715 / 1180
Регистрация: 27.07.2011
Сообщений: 11,433
03.04.2016, 20:20 18
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub mmm()
    'ВЫзов функции
    MsgBox Summa(2, 11)
End Sub
 
 
 
'Функция  возвращает сумму ячеек
'n - первая строка диапазона
'k - последняя строка
'c - номер столбца
Public Function Summa(n As Integer, Optional ByVal k As Integer, Optional ByVal c As Integer = 5) As Single
    If n <= k Then Summa = Summa(n + 1, k) + Cells(n, c)
End Function
0
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
03.04.2016, 20:43  [ТС] 19
Гут) Скажите-где я неправ? Считать сумму считает, но почему-то умножает её на 2))
Причём если заполнены только 9 ячеек диапазона, то считает верно, но стоит лишь заполнить 10-ю- и умножает итог на 2...
0
Вложения
Тип файла: xls 111.xls (75.5 Кб, 5 просмотров)
8 / 6 / 3
Регистрация: 29.03.2015
Сообщений: 135
03.04.2016, 20:45  [ТС] 20
Причём ведёт себя случайно в зависимости от заполнения ячеек..
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2016, 20:45

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Реализовать приложение, в котором рекурсивная функция используется для суммирования целых чисел от 1 до N
помогите найти ошибку что то не так с переменными, не пойму что procedure...

Рекурсивная функция у меня другая но только не рекурсивная
Добрый день все ! Писал я про задачку но так и не кто откликнулся напомню о чем речь &quot; Добрый...

Функция суммирования
Написал фунцию наибольшей суммы x кол-ва чисел в списке. Выходит непонятная мне ошибка. Помогите...

Функция суммирования столбца
вот написал такой код function stringrid_sum(st: TStringGrid; stol: Integer):double; var i :...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.