Shape Rule
Left-shifted triangle
Row i prints i numbers computed as i + j - 1.
i + j - 1 in JavaScript
The increasing number triangle using i + j - 1 prints 1, 2 3, 3 4 5, … — a natural follow-up after Program 32’s triangle starting from 11. This tutorial covers the i + j - 1 formula, nested loops, a live preview, worked JavaScript examples, edge cases, and complexity.
Left-shifted triangle
Row i prints i numbers computed as i + j - 1.
i = 1..rows
for (let i = 1; i <= rows; i++) — one growing row per iteration.
1..i
for (let j = 1; j <= i; j++) — appends i values per row.
i + j - 1
Each value is i + j - 1 — row i starts at i when j = 1.
3–9 rows
Pick a row count and draw the increasing triangle in the browser.
Complexity
Prints per row = i — total work scales as n².
A left-shifted increasing number triangle prints values from the formula i + j - 1 on each row. With rows = 5, you get 1, 2 3, 3 4 5, and so on.
In JavaScript you use nested loops: outer i = 1..rows, inner j = 1..i, appending (i + j - 1) with a trailing space.
It combines nested loops with a compact arithmetic formula — a step after Program 32’s 9 + i + j offset.
Formula for each value.
Growing row width.
When i=1, j=1 → 1.
Follow Program 32; continue to Program 34 (i + j from 0) next.
In short: outer loop i = 1..rows, inner j = 1..i, print i + j - 1 with a space, then console.log(line).
Given rows = 5, print a left-shifted increasing triangle: for each row i, print j = 1..i values of i + j - 1 separated by spaces.
// rows = 5 (conceptual shape)
const rows = 5;
for (let i = 1; i <= rows; i++) {
let line = "";
for (let j = 1; j <= i; j++) {
line += (i + j - 1) + " ";
}
console.log(line);
} | Item | Type | Description |
|---|---|---|
rows | int | Triangle height — number of lines to print. |
i | int | Outer loop — current row; also part of the formula. |
j | int | Inner loop — column index; runs 1..i per row. |
for i from 1 to rows:
for j from 1 to i:
line += (i + j - 1) + " "
console.log(line) | Approach | Idea | Best for |
|---|---|---|
| Fixed formula | 1, 2 3, … | Learning and interviews |
| User-input rows | parseInt(prompt(...), 10) | Configurable triangle size |
| Compact trace | rows = 3 on paper first | Debugging loop bounds |
| Goal | Pattern |
|---|---|
| Outer loop | for (let i = 1; i <= rows; i++) |
| Inner loop | for (let j = 1; j <= i; j++) |
| Print value | line += (i + j - 1) + " " |
| End the row | console.log(line) |
| User input | parseInt(prompt(...), 10) |
Same increasing triangle — different ways to control the row count.
i = 1..rowsOne growing row per iteration
i + j - 1Starts at 1
j = 1..ii values per row
j = 1 → iRow starts at row number
Reach for this pattern when teaching formula-based output, growing inner loops, and arithmetic in nested loops.
Natural follow-up after the triangle starting from 11 — uses i + j - 1 to start at 1.
Outer/inner bound practice with an immediate visual check.
Combine loops with prompt() for a flexible row count.
Compare Program 32 (9 + i + j) and Program 34 (i + j from 0) next.
This is a console teaching pattern — not how you build modern app screens.
Key benefit: one small program that locks in nested loops, output sequencing, and O(n²) thinking.
Choose a row count between 3 and 9 and draw the increasing triangle in the browser.
Three complete JavaScript programs — fixed rows, user input, and a smaller trace demo. Click View Output to reveal sample console results, or Try it Yourself to run the code live.
Print five rows of the increasing triangle with the i + j - 1 formula.
rows = 5Hard-coded row count — ideal for first demos and screenshots.
const rows = 5;
for (let i = 1; i <= rows; i++) {
let line = "";
for (let j = 1; j <= i; j++) {
line += (i + j - 1) + " ";
}
console.log(line);
} When i = 1, the inner loop prints 1+1-1 = 1. When i = 4, it prints 4, 5, 6, 7 — output 4 5 6 7.
Read the row count with prompt() and parseInt() instead of hard-coding 5.
Read rows with prompt() and parseInt() instead of hard-coding 5.
const rowsInput = prompt("Enter rows:");
const rows = parseInt(rowsInput, 10);
if (!Number.isFinite(rows) || rows < 1) {
console.log("Please enter a positive integer.");
} else {
for (let i = 1; i <= rows; i++) {
let line = "";
for (let j = 1; j <= i; j++) {
line += (i + j - 1) + " ";
}
console.log(line);
}
} Same formula core as Example 1; only rows comes from user input instead of being hard-coded as 5. Non-numeric input yields NaN with bare parseInt(prompt(), 10) — validate with Number.isFinite for safer labs.
Run with rows = 3 to trace every row on paper before scaling up.
rows = 3Same nested-loop formula with a smaller row count for quick tracing.
const rows = 3;
for (let i = 1; i <= rows; i++) {
let line = "";
for (let j = 1; j <= i; j++) {
line += (i + j - 1) + " ";
}
console.log(line);
} Only rows changes from 5 to 3 — the nested-loop formula stays identical. Trace i = 1, 2, 3 on paper to see how each row adds one more value.
No imports needed for fixed rows; use prompt() when reading. Set const rows = 5 and loop variables i, j.
for (let i = 1; i <= rows; i++) — one growing row per iteration.
for (let j = 1; j <= i; j++) — appends i values per row.
line += (i + j - 1) + " " — each value from the arithmetic formula.
console.log(line) ends the row after the inner loop finishes.
Prints per row = i — O(n²) time, O(1) extra memory.
rows = 5Trace each outer-loop value of i, inner-loop range, values printed, and full row output.
i | Inner range (j) | Values (i+j-1) | Row output |
|---|---|---|---|
1 | 1 | 1 | 1 |
2 | 1, 2 | 2, 3 | 2 3 |
3 | 1, 2, 3 | 3, 4, 5 | 3 4 5 |
4 | 1..4 | 4, 5, 6, 7 | 4 5 6 7 |
5 | 1..5 | 5, 6, 7, 8, 9 | 5 6 7 8 9 |
Prints per row = i — total prints = n(n+1)/2 for n rows.
Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.
Clearest visual proof that outer and inner bounds interact.
Example: change inner bound to j <= rows and watch every row print the same width.
Foundation for formula-based triangles and left-shifted sequences starting at 1.
Example: continue to Program 34 for the i + j variant starting from 0.
Practice line += vs row newline without complex math.
Example: put console.log(line) inside the inner loop by mistake.
Add spaces between digits once the two-loop structure works.
Example: use line += (i + j - 1) + " " between digits for wider spacing.
Triangular totals make O(n²) concrete for beginners.
Example: count printed numbers for rows = 5 — total is 1+2+3+4+5 = 15.
Pair the pattern with Number.isFinite and positive-row checks.
Example: reject rows <= 0 and re-prompt.
Pro Tip: when an interviewer asks for patterns, explain the outer/inner roles first — then write the loops. The story matters as much as the code.
Why this pattern earns a permanent spot in beginner JavaScript courses.
Wrong bounds show up immediately as a broken staircase.
Only loops and console output — no arrays or math libraries.
Invert, center, hollow, or change the fill character with small edits.
Streaming output needs no storage beyond loop counters.
Pro Tip: trace i and j on paper for rows = 3 before coding — watch how row i starts at i when j = 1.
Small habits that keep number-pattern code clean.
Inner bound must be j <= i — row i prints exactly i numbers.
Number.isFiniteUse Number.isFinite so bad input does not produce NaN when converting rows.
Only call console.log(line) after the inner loop finishes the row.
Write the formula for each (i, j) pair before coding the loops.
Trace i = 1..3 on paper before coding the full rows = 5 demo.
Pro Tip: if the output is a vertical list of single digits per line, you almost certainly put console.log(line) inside the inner loop.
Mistakes that commonly break increasing number triangles.
Each digit lands on its own line — you get a column, not a triangle.
→ Use line += (i + j - 1) + " "; console.log(line) only after the inner loop.
Using i + j or 9 + i + j shifts every value — rows no longer start at the row number.
→ Keep i + j - 1 so row i begins at i.
j <= rows prints a rectangle — every row has the same width.
→ Keep for (let j = 1; j <= i; j++) so row i prints i values.
Printing numbers without a space makes multi-digit values run together on wider rows.
→ Append a space after each number: line += (i + j - 1) + " ".
parseInt(prompt())Letters or empty input yield NaN with bare parseInt(prompt(), 10).
→ Validate with Number.isFinite and re-prompt on failure.
Check these inputs before calling the solution done.
Output is just 1 — one value, one row.
Outer loop never runs — print nothing or show a message.
rows < 0Treat as invalid; re-prompt instead of silent empty output.
Two rows: 1 and 2 3.
Bare parseInt(prompt(), 10) yields NaN on bad input — validate with Number.isFinite first.
Total prints = n(n+1)/2 — grows quadratically with row count.
Try these variations to lock in the pattern.
i + j with i starting at 09 + i + j instead of i + j - 1j = 1, i + j - 1 = irows >= 1 after reading inputi + j - 1. Inner loop runs j = 1..i — row i prints i numbers.line += (i + j - 1) + " " stays on the line; console.log(line) advances — mix them carefully.rows > 0 for interactive programs; rows = 1 prints a single 1.j = 1, the value is always i — compare with Program 34 where the formula is i + j.Quick Takeaway: outer loop i = 1..rows, inner j = 1..i, print i + j - 1, then console.log(line).
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–3) | O(n²) | O(1) |
| Smaller demo (Example 3) | O(n²) | O(1) |
The increasing number triangle using i + j - 1 is a compact lesson in formula-based nested loops: compute each value with i + j - 1, grow the inner bound to i, and end each row with console.log(line). Master the fixed-rows version, then try user input and a smaller trace demo.
Practice the three examples above, then continue to Program 34 for the i + j variant starting from 0.
Inner bound must be j <= i — validate rows when reading from the console.
for (let i = 1; i <= rows; i++) in the outer loopfor (let j = 1; j <= i; j++) appends i valuesline += (i + j - 1) + " "parseInt(prompt(), 10) with Number.isFiniteconsole.log(line) inside the inner loopj <= rows in the inner loop (prints a rectangle)rows = 1 edge casePrint the pattern the beginner-friendly way.
i + j - 1
Definitionj = 1..i
Codej=1 → i
Codeconsole.log(line) after the inner loop
O(n²) time
AnalysisEach printed value is computed as i + j - 1. Row i = 1 prints 1; row i = 4 prints 4, 5, 6, 7 — a left-shifted increasing triangle starting at 1.
Move on to the increasing number triangle starting from 0 (i + j) in the JavaScript number-pattern series.
12 people found this page helpful