Функция pallon multall (array) умножает все число в массивах в каскадном наборе массивов [duplicate]

Я просматривал все примеры и ответы о том, как передать любой массив на сервер sql без проблем с созданием нового типа таблицы, пока я не нашел это linK , ниже, как я применил это в мой проект:

- Следующий код будет получать Array как параметр и вставить значения этого --array в другую таблицу

Create Procedure Proc1 


@UserId int, //just an Id param
@s nvarchar(max)  //this is the array your going to pass from C# code to your Sproc

AS

    declare @xml xml

    set @xml = N'' + replace(@s,',','') + ''

    Insert into UserRole (UserID,RoleID)
    select 
       @UserId [UserId], t.value('.','varchar(max)') as [RoleId]


    from @xml.nodes('//root/r') as a(t)
END 

Надеюсь, вам понравится это

4
задан AlG 27 July 2012 в 19:49
поделиться

4 ответа

позволяет пройти через выполнение.

fact(5):
   5 is not 0, so fact(5) = 5 * fact(4)
   what is fact(4)?
fact(4):
   4 is not 0, so fact(4) = 4 * fact(3)
   what is fact(3)?
fact(3):
   3 is not 0, so fact(3) = 3 * fact(2)
   what is fact(2)?
fact(2):
   2 is not 0, so fact(2) = 2 * fact(1)
   what is fact(1)?
fact(1):
   1 is not 0, so fact(1) = 1 * fact(0)
   what is fact(0)?
fact(0):
   0 IS 0, so fact(0) is 1

Теперь давайте собираем наш результат.

fact(5) = 5* fact(4)

подставляем в наш результат для факта (4)

fact(5) = 5 * 4 * fact(3)

замените в нашем результате факт (3)

fact(5) = 5 * 4 * 3 * fact(2)

в нашем результате для факта (2)

fact(5) = 5 * 4 * 3 * 2 * fact(1)

заменим в нашем результате факт (1 )

fact(5) = 5 * 4 * 3 * 2 * 1 * fact(0)

замените в нашем результате факт (0)

fact(5) = 5 * 4 * 3 * 2 * 1 * 1 = 120

И вот он у вас есть. Рекурсия - это процесс устранения более серьезной проблемы, рассматривая ее как проблемы с меньшим количеством проблем, пока вы не достигнете тривиального (или «базового») случая.

16
ответ дан Ross Larson 25 August 2018 в 00:07
поделиться

Прервите проблему до шагов ее выполнения.

fact(5)
| 5  * fact(4)
|| 5 * (4 * fact(3))
||| 5 * (4 * (3 * fact(2))
|||| 5 * (4 * (3 * (2 * fact(1))))
||||| 5 * (4 * (3 * (2 * (1 * fact(0)))))
|||||| 5 * 4 * 3 * 2 * 1 * 1
120

Ваша функция просто вызывает себя, как и любая другая функция. Однако в этом случае вашей функции требуется точка остановки, так что она не бесконечно рекурсивно (вызывая переполнение стека!). В вашем случае это когда n равно 0 (вероятно, должно быть 1 вместо).

9
ответ дан Rob Wagner 25 August 2018 в 00:07
поделиться

Рекурсивная функция - это функция, которая вызывает себя и продолжает делать это до тех пор, пока оценка не будет завершена и не будет получен результат. Ключ с факториальной функцией, которую вы имеете выше, является возвратом x * fact (x-1)

. Поэтому, если вы введете 5, он выполнит 5 * факт (5-1) * факт 4-1). ... И так далее, пока он не достигнет 0, а затем вернется 1. Итак, у вас будет 5 * 4 * 3 * 2 * 1, что равно 120.

Он продолжает выделять переменные в стеке. Поэтому, если вы поставили слишком высокое число, это может привести к исключению переполнения стека. Если вы не используете что-то, называемое оптимизацией вызовов (TCO), которое превращает рекурсивную функцию в цикл for и очищает выделенную память.

2
ответ дан The Internet 25 August 2018 в 00:07
поделиться

Имейте в виду, что каждый вызов факта (), вызванный извне или вызываемый сам по себе, получает свой собственный набор локальных переменных.

fact1 has n of 5
   fact2 has n of 4
      fact3 has n of 3
         fact4 has n of 2
            fact5 has n on 1
               fact6 has n of 0



   The deepest ones (EG fact6 is deepest) are computed completely before the levels above them in the callstack are able to finish.

So fact6 returns a 1 to fact5 (termination case).
fact5 returns a 1 to fact4 (1*1)
fact4 returns a 2 to fact3 (2*1)
fact3 returns a 6 to fact2 (3*2)
fact2 returns a 24 to fact1 (4*6)
and finally fact1 returns 120 (5*24) to its caller, whatever that may be.
4
ответ дан user1277476 25 August 2018 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: