3

У меня есть следующая функция:

f(n) = f(n - 1) + (n - 1)
f(0) = 0
n >= 0

Я объявил n в столбце A, и мне нужен результат f(n) в столбце B.

Я пытаюсь найти эквивалент формулы Excel для этой функции.

Образец результата:

A | B
--+--
0 | 0

или же:

A | B
--+--
1 | 0

или же:

A | B
--+--
4 | 6

но никогда:

A | B
--+--
0 | 0
1 | 0
2 | 1
...

Самая большая проблема в том, что я не могу смоделировать значение f(n - 1) . Поэтому ссылка на предыдущий ряд, как в приведенном выше примере, недопустима. Я почти уверен, что ответ тривиален, я просто не могу его найти.

8 ответов8

14

Это помогает?

f(n) = sum of all positive integers less than n

Стоит, особенно с помощью какой- то арифметики.

Хорошо, учитывая, что люди теперь публикуют ответы с пользовательскими функциями, вот ответ

f(n) = (n-1)n/2

Обновление: для тех, кто не видит, что формула не использует никакой информации из каких-либо других строк (см. Комментарий Стэна Р. ниже), я немного перемешал порядок:

 0  =(A1-1)*A1/2    0
 9  =(A2-1)*A2/2    36
 2  =(A3-1)*A3/2    1
 4  =(A4-1)*A4/2    6
 6  =(A5-1)*A5/2    15
 5  =(A6-1)*A6/2    10
10  =(A7-1)*A7/2    45
 8  =(A8-1)*A8/2    28
 3  =(A9-1)*A9/2    3
 7  =(A10-1)*A10/2  21
 1  =(A11-1)*A11/2  0
...
7

Вам нужно решить это рекурсивно? Это, конечно, не самый лучший способ решить эту проблему:

Суммируйте числа от 1 до 10

   1 + 2 + 3 + 4 + 5
+ 10 + 9 + 8 + 7 + 6
  --  --  --  --  --
  11 +11 +11 +11 +11 = 55

или, как подытожено, (n+1)(n/2) - при n = 10 это, очевидно, 11 x 5

3

Функция может быть изменена, чтобы исключить рекурсию.

Давайте возьмем пару примеров здесь ...

f(4)=1+2+3=6
f(5)=1+2+3+4=10
f(6)=1+2+3+4+5=15

Здесь есть образец:

f(4)=1+2+3=6=4*1.5
f(5)=1+2+3+4=10=5*2
f(6)=1+2+3+4+5=15=6*2.5

это означает, что мы можем обобщить функцию на f(n)=1+2+...+n=n*(n-1)/2 для n> 1 и f(n)=0 противном случае.

Полученную формулу Excel можно записать в виде =IF(A5>1;A5*(A5-1)/2);0) , предполагая, что A5 содержит n.

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

2

В Excel есть нечто, называемое Array Formulas, которое позволяет функции возвращать набор значений. Вы можете прочитать больше о них здесь. Они позволят вам с некоторой креативностью написать аналоги рекурсивных алгоритмов. Формулы массива должны быть введены с помощью Shift-Ctrl-Enter.

Чтобы ответить на ваш вопрос, сделайте так, чтобы функция массива возвращала от 1 до n-1, и заключите ее в сумму. Здесь Indirect создает ссылку, а A1 содержит n:

=SUM( ROW( INDIRECT("1:"&A1-1) ) )
2

Не уверен, как это сделать с чистыми формулами. Одним из вариантов является UDF

Public Function f(n As Integer) As Integer
    If (n = 0) Then
        f = 0
        Exit Function
    End If

    If (n > 0) Then
        f = f(n - 1) + (n - 1)
    End If
End Function

и тогда формула просто =f(A1)

0

если вас правильно понимают, то вы пытаетесь создать рекурсивную функцию, и циклические ссылки в Excel не допускаются. Лучше всего создать собственную функцию листа.

Нажмите Alt+F11, чтобы войти в VB, затем Вставьте> Модуль и следуйте ответу Скотта .

0

Обычно способ сделать это - определить свои собственные функции. В редакторе VBA вставьте новый модуль в рабочую книгу и вставьте следующую функцию:

Function f(n As Integer)
    If n <= 0 Then
        f = 0
    Else
        f = f(n - 1) + (n - 1)
    End If
End Function

Теперь вы можете позвонить это напрямую:

=f(A2)
0
=IF(MOD(A1,2)=0,(A1-1)*ROUND(A1/2,0), (A1) * ((A1-1)/2))

Я не знаю, если это то, что вы ищете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .