Предмет: Информация. Вопрос: 26
Если при вычислении на компьютере числа сочетаний из n по к, равного
C(индекс n, степень k)= (n!)/(k!*(n-k)!), находить отдельно числитель и знаменатель, то может возникнуть проблема переполнения. Проблема решается рекуррентной формулой C(индекс n, степень k)=C(индекс n-1, степень k)+C(индекс n-1, степень k-1). Ниже приведены девять пронумерованных в произвольном порядке фрагментов функции, написанной на языке С++ и реализующей вычисление C(индекс n, степень k) по приведённой рекуррентной формуле. В
лист ответов запишите номера фрагментов без пробелов и запятых в том порядке, при котором данная функция корректно решает поставленную задачу. Таким образом, ответом задания является девятизначное натуральное число.
1) n, long k
2) return n; if (k==0) return 1;
3) ){
4) (long
5) if (n==k) return 1; if (k==1)
6) c(n-1, k)+c(n-1, k-1);
7) }
8) long C
9) return
Проблему целочисленного переполнения заменили проблемой переполнения стека и многократно избыточными вычислениями. Это талант.
Последовательность строк:
8
4
1
3
5
2
9
6
7
(Переведено еще раз переводчиком!)
Ответ на этот вопрос 6.
Это связано с тем, что второй фрагмент (2) будет выполняться первым, если n и k оба являются длинными значениями.
Как только этот фрагмент будет выполнен, n и k будут установлены в 0.
Это приведет к тому, что условные операторы как во фрагменте (3), так и во фрагменте (6) будут оценены как ложные.
Следовательно, фрагмент (3) и фрагмент (6) не будут выполняться.
Это означает, что функция вернет значение 6, что является правильным ответом.