A V-shaped hollow pattern prints only the outline of an upright V: two stars on the widest top row, then legs that meet at a single bottom vertex.
Remember
Rule: same as Program 7 — only reverse the outer loop
* *
* *
* *
* *
* ← 5 rows (width 9)
It is the flip of Program 7: keep the same left/right conditions, reverse only the outer loop. That mirrors how Program 6 inverts Program 5. This outline is also the lower half of the hollow diamond.
Approach
How to Solve It
Two ways to emit the same outline — start with if/else legs, then optionally shorten with a conditional expression.
Method
Idea
Best for
If/else legs
Countdown i; left j and right k; star when indices match
Learning, interviews, exams
Conditional expression
Same bounds; one-line star-vs-space choice
Shorter demos once conditions click
Pseudocode
Pseudocode
for i from rows down to 1:
for j from rows down to 1:
print "*" if i == j else " "
for k from 2 to rows:
print "*" if i == k else " "
print newline
Print cells without a newline, then end the row once.
Try it
Live Preview
Change the height and the hollow V updates instantly — including width and star count.
Whole numbers from 1 to 14. Each line is 2 * rows - 1 characters wide.
Live result5 rows · 9 stars
* *
* *
* *
* *
*
Trace
Worked Walkthrough — rows = 4
Trace where each star lands as i counts down from 4 to 1 (line width = 7).
i
Left star (j)
Right star (k)
Stars
Printed row
4
j == 4
k == 4
2
* *
3
j == 3
k == 3
2
* *
2
j == 2
k == 2
2
* *
1
j == 1
none (k starts at 2)
1
*
The last row is the only single-star line — that is why the right loop must not start at k = 1. Total stars: 2 + 2 + 2 + 1 = 7 = 2×4 - 1.
Code
Python Programs
Three complete programs: countdown if/else, input(), and a conditional-expression shortcut. Use View Output to reveal sample results.
Example 1 — Fixed rows = 5
Hard-coded height — outer loop counts down; left j = rows..1; right k = 2..rows.
Python
rows = 5
for i in range(rows, 0, -1):
for j in range(rows, 0, -1):
if i == j:
print("*", end="")
else:
print(" ", end="")
for k in range(2, rows + 1):
if i == k:
print("*", end="")
else:
print(" ", end="")
print()
Output
* *
* *
* *
* *
*
How It Works
1. Set height.rows = 5 means five outline lines (width 9).
2. Outer loop counts down.range(rows, 0, -1) walks i from rows (widest legs) down to 1 (bottom vertex).
3. Left leg.j counts from rows down to 1; print * only when i == j.
4. Right leg, then break.k runs from 2 to rows with the same match rule, then bare print().
When i = 5 stars land at both outer columns; when i = 1 only the left loop prints a star.
Example 2 — User Input Version
Read the height at runtime. Prefer a try / except in real apps (shown in the tip below).
Python
rows = int(input("Enter the number of rows: "))
for i in range(rows, 0, -1):
for j in range(rows, 0, -1):
if i == j:
print("*", end="")
else:
print(" ", end="")
for k in range(2, rows + 1):
if i == k:
print("*", end="")
else:
print(" ", end="")
print()
Output (when user enters 4)
Enter the number of rows: 4
* *
* *
* *
*
How It Works
1. Prompt and read.input() returns a string; int(...) converts it to a whole number.
2. Same countdown core. Only the source of rows changes — the left/right leg logic matches Example 1.
3. Safer input tip.int(input()) raises ValueError on letters. Prefer:
Safer input
raw = input("Enter the number of rows: ").strip()
try:
rows = int(raw)
except ValueError:
print("Enter a positive whole number.")
raise SystemExit
if rows < 1:
print("Enter a positive whole number.")
raise SystemExit
Example 3 — Conditional Expression Form
Keep both loops and the countdown; compress the star-vs-space choice into one expression each.
Python
rows = 5
for i in range(rows, 0, -1):
for j in range(rows, 0, -1):
print("*" if i == j else " ", end="")
for k in range(2, rows + 1):
print("*" if i == k else " ", end="")
print()
Output
* *
* *
* *
* *
*
How It Works
1. Same countdown. Still walk i from rows down to 1.
2. Same bounds. Left j still counts down; right k still starts at 2.
3. Shorter print."*" if i == j else " " replaces the multi-line if/else — same decision, less code.
Learn the if/else version first (Examples 1–2) so you can explain the branch in an interview; treat this as a polish shortcut afterward.
Edge Cases & Pitfalls
Check these before calling the solution done.
range up
Inverted V by mistake
If you use range(1, rows + 1), you reprint Program 7. Use range(rows, 0, -1).
k = 1
Duplicate vertex
Starting the right loop at k = 1 prints two stars on the bottom row. Keep range(2, rows + 1).
print() inside
Broken outline
If bare print("*") is inside either inner loop, each cell lands on its own line. Use end="" for cells; print() only after both loops.
rows = 1
Single vertex
Output is just * — right loop never runs. A good sanity check.
rows ≤ 0
Empty output
Outer loop never runs. Validate and re-prompt for interactive programs.
Bad input
Use try / except
int(input()) raises ValueError on letters — prefer try / except.
Analysis
Time and Space Complexity
Program
Time
Extra space
If/else legs (Examples 1–2)
O(rows²)
O(1)
Conditional form (Example 3)
O(rows²)
O(1)
About n rows × 2n - 1 characters printed per row — still quadratic in n. Total stars = 2n - 1 (same as Program 7; only print order differs).
Remember
Key Takeaways
Rule: countdown i; print * only when i == j or i == k.
Flip of Program 7: same inner loops — only reverse the outer loop.
Break the row: call print() only after both inner loops.
Complexity:O(n²) time; O(1) extra space.
One line: for i from rows down to 1, print a star only when the left or right index matches i — start the right loop at 2.
Frequently Asked Questions
Program 7 runs i from 1 to rows (inverted V: narrow top). Program 8 runs i from rows down to 1 with the same inner loops, so the first line uses i equal rows and prints stars at both outer columns. As i decreases, both legs move inward until the last line has a single bottom vertex.
Only the outer loop direction changes. Program 7 uses for i in range(1, rows + 1). Program 8 uses for i in range(rows, 0, -1). The conditions i equals j and i equals k are the same.
When i is 1, the left loop still prints a star at j equals 1. The right loop runs k from 2 to rows, so i equals k never holds on that row.
print("*", end="") stays on the same line. print() ends the current line. Stars and spaces use end=""; the row break uses print() after both inner loops.
Each line has width 2 * rows - 1 characters — same geometry as Program 7, only the row order is reversed.
This page is the lower half of Program 9. Stack Program 7 on top, then this body from rows-1 down to 1, to complete the diamond.
O(n²) for n rows. Each row runs Theta(n) iterations across the two inner loops.
Wrap int(input()) in try/except ValueError, or check that the raw string is digits, and require rows >= 1.
🤔
Did you know?
This hollow V is exactly Program 7 with the outer loop reversed — the same trick as Program 5 versus Program 6. It is the lower half of the hollow diamond. The bottom vertex is a single star because k starts at 2.