Arrays and Lists Lab Problem 3. Last K numbers sum
Здравейте,
На първо място - честита Коледа на всички.
Имам въпрос по задача 3 от Arrays and Lists - Lab.
Условие на задачата:
Enter two integers n and k. Generate and print the following sequence of n elements:
- The first element is: 1
- All other elements = sum of the previous k elements (if less than k are available, sum all of them)
- Example: n = 9, k = 5 à 120 = 4 + 8 + 16 + 31 + 61
Решение: http://pastebin.com/NRtwc1yd
Не успях да стигна самостоятелно до решение, преписах кода от видео - урока към Arrays and Lists - Exercises. Не мога да разбера как се пълни масива numbers[]. Ясно ми е, че задавам в кода numbers[0] = 1, но как се определя numbers[j] при j !=0???
Предварително благодаря за съдействието.
Много благодаря за отговора. Уверявам Ви, че преди да пиша във форума се опитах "с лист и химикал" и се опасявам, че не успях да разбера (с което никак не се гордея :). Също така използвах debugger - a, видях какви стойности приемат променливите, но не можах да си обясня "магията", която ги кара да заемат тези стойности. Все още не разбирам:
sum = sum(0) + numbers[j(1)] = 0 + 1 = 1,
и по - конкретно - защо при j = 1, sum[j(1)] = 1? Разбирам, че при i = 2, в тази итерация на външния цикъл, j приема стойности 1 и 0 и при j = 0, sum = 1. Защо обаче при j = 1, sum[j(1)] = sum(0) + sum[j(1)] = 0(до тук всичко разбирам)+ 1(ето тази единица не разбирам защо се получава??).
Предварително благодаря за съдействието - знам, че въпросът не е "high level" и съм Ви благодарен, че отделяте от времето си да ми помогнете по това време на годината. Уверявам Ви, че опитах сам - не можах да се справя.
Всичко е наред. Единицата във втората итерация се появява, защото използваме j като индекс за стойност в масива, която вече е известна и е установена. Преди първата итерация, когато сме присвоили стойност само на първата клетка, масивът изглежда така:
Стойността на X не ни интересува, защото останалите клетки тепърва ще бъдат "запълвани" със стойностите на sum. По време на първата итерация, присвояваме стойност на втората клетка, като предварително изчисляваме стойността, която ще присвоим, и това се осъществява на следния ред
Тук просто сумираме sum и елементът с индекс j (като текущата стойност на j e 0), а какво имаме в масивът на позиция 0? Единица. След като приключим с това сумиране, присвояваме резултатът на клетката с индекс i:
И така, масивът вече изглежда по следния начин:
При следващите итерации на двата цикъла, стойността на j отново се използва просто като индексираща стойност
Горният израз може да бъде записан и без нотацията, естествено
Тук отново сумираме sum и елементът с индекс текущата стойност на j, която е единица. А каква е стойността на клетката с индекс 1? Единица, и знаем това от предишната итерация, и в частност, от това присвояване:
На всяка следваща итерация на цикъла се възползваме от фактът, че предишната стойност в масивът вече е известна, изчислена.
P.S. Предполагам, че това вече Ви е известно, но все пак ще напомня, че този израз
е просто удобен начин да представите сумата на лявата операнда (sum) и дясната операнда (numbers[j]); алтернативен начин да бъде представен израза
:) Много благодаря за съдействието!