Я просматривал все примеры и ответы о том, как передать любой массив на сервер 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
Надеюсь, вам понравится это
позволяет пройти через выполнение.
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
И вот он у вас есть. Рекурсия - это процесс устранения более серьезной проблемы, рассматривая ее как проблемы с меньшим количеством проблем, пока вы не достигнете тривиального (или «базового») случая.
Прервите проблему до шагов ее выполнения.
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 вместо).
Рекурсивная функция - это функция, которая вызывает себя и продолжает делать это до тех пор, пока оценка не будет завершена и не будет получен результат. Ключ с факториальной функцией, которую вы имеете выше, является возвратом x * fact (x-1)
. Поэтому, если вы введете 5, он выполнит 5 * факт (5-1) * факт 4-1). ... И так далее, пока он не достигнет 0, а затем вернется 1. Итак, у вас будет 5 * 4 * 3 * 2 * 1, что равно 120.
Он продолжает выделять переменные в стеке. Поэтому, если вы поставили слишком высокое число, это может привести к исключению переполнения стека. Если вы не используете что-то, называемое оптимизацией вызовов (TCO), которое превращает рекурсивную функцию в цикл for и очищает выделенную память.
Имейте в виду, что каждый вызов факта (), вызванный извне или вызываемый сам по себе, получает свой собственный набор локальных переменных.
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.