Loops/For

From Rosetta Code
Task
Loops/For
You are encouraged to solve this task according to the task description, using any language you may know.

“For” loops are used to make some block of code be iterated a number of times, setting a variable or parameter to a monotonically increasing integer value for each execution of the block of code. Common extensions of this allow other counting patterns or iterating over abstract structures other than the integers.

For this task, show how two loops may be nested within each other, with the number of iterations performed by the inner for loop being controlled by the outer for loop. Specifically print out the following pattern by using one for loop nested in another:

*
**
***
****
*****
Reference

Contents

360 Assembly[edit]

LOOPFORC CSECT
USING LOOPFORC,R12
LR R12,R15 set base register
BEGIN SR R2,R2 from 1
LA R4,1 by 1
LA R5,5 to 5
LOOPI BXH R2,R4,ELOOPI i (R2)
LA R8,BUFFER-1
SR R3,R3 from 1
LA R6,1 by 1
LR R7,R2 to i
LOOPJ BXH R3,R6,ELOOPJ j (R3)
LA R8,1(R8)
MVI 0(R8),C'*'
B LOOPJ
ELOOPJ XPRNT BUFFER,L'BUFFER
B LOOPI
ELOOPI EQU *
RETURN XR R15,R15 set return code
BR R14 return to caller
BUFFER DC CL80' '
YREGS
END LOOPFORC
Output:
*
**
***
****
*****

8th[edit]

This illustrates two kinds of 'for' loop. The first kind is "loop", which iterates from the low to the high value, and passes the current loop index as a parameter to the inner word. The second is 'times', which takes a count and repeats the word that many times.

 
( ( '* putc ) swap times cr ) 1 5 loop
 

ActionScript[edit]

var str:String = "";
for (var i:int = 1; i <= 5; i++) {
for (var j:int = 1; j <= i; j++)
str += "*";
trace(str);
str = "";
}

Ada[edit]

for I in 1..5 loop
for J in 1..I loop
Put("*");
end loop;
New_Line;
end loop;

ALGOL 60[edit]

FOR i:=1 UNTIL 5 DO
FOR j:=1 UNTIL i DO
OUTTEXT("*");
OUTLINE

ALGOL 68[edit]

Works with: ALGOL 68 version Revision 1 - no extensions to language used
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny
Works with: ELLA ALGOL 68 version Any (with appropriate job cards) - tested with release 1.8-8d
FOR i TO 5 DO
TO i DO
print("*")
OD;
print(new line)
OD
Output:
*
**
***
****
*****

ALGOL W[edit]

In Algol W, write starts a new line, writeon continues it.

begin
for i := 1 until 5 do
begin
write( "*" );
for j := 2 until i do
begin
writeon( "*" )
end j
end i
end.

Alore[edit]

for i in 0 to 6
for j in 0 to i
Write('*')
end
WriteLn()
end
 

AmigaE[edit]

PROC main()
DEF i, j
FOR i := 1 TO 5
FOR j := 1 TO i DO WriteF('*')
WriteF('\n')
ENDFOR
ENDPROC

Apex[edit]

for (Integer i = 0; i < 5; i++) {
String line = '';
 
for (Integer j = 0; j < i; j++) {
line += '*';
}
 
System.debug(line);
}
 
List<String> lines = new List<String> {
'*',
'**',
'***',
'****',
'*****'
};
 
for (String line : lines) {
System.debug(line);
}

AppleScript[edit]

set x to return
repeat with i from 1 to 5
repeat with j from 1 to i
set x to x & "*"
end repeat
set x to x & return
end repeat
return x
Output:
"
"

AutoHotkey[edit]

Gui, Add, Edit, vOutput r5 w100 -VScroll ; Create an Edit-Control
Gui, Show ; Show the window
Loop, 5 ; loop 5 times
{
Loop, %A_Index% ; A_Index contains the Index of the current loop
{
output .= "*" ; append an "*" to the output var
GuiControl, , Output, %Output% ; update the Edit-Control with the new content
Sleep, 500 ; wait some(500ms) time, [just to show off]
}
Output .= (A_Index = 5) ? "" : "`n" ; append a new line to the output if A_Index is not "5"
}
Return ; End of auto-execution section

AWK[edit]

BEGIN {
for(i=1; i < 6; i++) {
for(j=1; j <= i; j++ ) {
printf "*"
}
print
}
}

Axe[edit]

In this example, the Axe code is nearly identical to the TI-83 BASIC version. However, note the swapped order of the I and J in the Output() statement. Also, unlike TI-83 BASIC, Axe does not support an increment value other than 1.

ClrHome
For(I,1,5)
For(J,1,I)
Output(J,I,"*")
End
End

Babel[edit]

((main { 10 star_triangle ! })
 
(star_triangle {
dup
<-
{ dup { "*" << } <->
iter - 1 +
times
"\n" << }
->
times }))
Output:
*
**
***
****
*****
******
*******
********
*********
**********

The key operator here is 'iter' which gives the current iteration of the loop body it resides in. When used with the 'times' operator, it generates a countdown.


bash[edit]

 
for i in {1..5}
do
for ((j=1; j<=i; j++));
do
echo -n "*"
done
echo
done
 


BASIC[edit]

Works with: QuickBasic version 4.5
FOR i = 1 TO 5
FOR j = 1 TO i
PRINT "*";
NEXT j
PRINT
NEXT i

Applesoft BASIC[edit]

FOR I = 1 TO 5 : FOR J = 1 TO I : PRINT "*"; : NEXT J : PRINT : NEXT

BBC BASIC[edit]

 
FOR I% = 1 TO 5
FOR J% = 1 TO I%
PRINT"*";
NEXT
PRINT
NEXT
 

Creative Basic[edit]

 
OPENCONSOLE
 
FOR X=1 TO 5
 
FOR Y=1 TO X
 
PRINT"*",:'No line feed or carriage return after printing.
 
NEXT Y
 
PRINT
 
NEXT X
 
PRINT:PRINT"Press any key to end."
 
DO:UNTIL INKEY$<>""
 
CLOSECONSOLE
 
END
 

GW-BASIC[edit]

10 FOR I = 1 TO 5
20 FOR J = 1 TO I
30 PRINT "*";
40 NEXT J
50 PRINT
60 NEXT I
 

FBSL[edit]

 
#APPTYPE CONSOLE
FOR DIM i = 1 TO 5
FOR DIM j = 1 TO i
PRINT "*";
NEXT j
PRINT
NEXT i
Pause
Output:
*
**
***
****
*****
Press any key to continue...

FUZE BASIC[edit]

-- Scott A. Rossell, 02-27-16

FOR n = 1 TO 5 CYCLE
FOR k = 1 TO n CYCLE
PRINT "*";
REPEAT
PRINT
REPEAT
END


IWBASIC[edit]

 
OPENCONSOLE
 
FOR X=1 TO 5
 
FOR Y=1 TO X
 
LOCATE X,Y:PRINT"*"
 
NEXT Y
 
NEXT X
 
PRINT
 
CLOSECONSOLE
 
END
 
'Could also have been written the same way as the Creative Basic example, with no LOCATE command.
 

Liberty BASIC[edit]

Unlike some BASICs, Liberty BASIC does not require that the counter variable be specified with 'next'.

for i = 1 to 5
for j = 1 to i
print "*";
next
print
next
 

PureBasic[edit]

If OpenConsole()
Define i, j
For i=1 To 5
For j=1 To i
Print("*")
Next j
PrintN("")
Next i
Print(#LFCR$+"Press ENTER to quit"): Input()
CloseConsole()
EndIf

Run BASIC[edit]

 
FOR i = 1 TO 5
FOR j = 1 TO i
PRINT "*";
NEXT j
PRINT
NEXT i
 

Visual Basic[edit]

Works with: VB6

Public OutConsole As Scripting.TextStream
For i = 0 To 4
For j = 0 To i
OutConsole.Write "*"
Next j
OutConsole.WriteLine
Next i

Visual Basic .NET[edit]

For x As Integer = 0 To 4
For y As Integer = 0 To x
Console.Write("*")
Next
Console.WriteLine()
Next

ZX Spectrum Basic[edit]

On the ZX Spectrum, we need line numbers:

 
10 FOR i = 1 TO 5
20 FOR j = 1 TO i
30 PRINT "*";
40 NEXT j
50 PRINT
60 NEXT i
 

Batch File[edit]

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
 
for /l %%i in (1,1,5) do (
SET line=
for /l %%j in (1,1,%%i) do (
SET line=!line!*
)
ECHO !line!
)
 
ENDLOCAL

bc[edit]

for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++) "*"
"
"
}
quit

Befunge[edit]

1>:5`#@_:>"*",v
| :-1<
^+1,+5+5<

Bracmat[edit]

  0:?i
& whl
' ( !i+1:~>5:?i
& 0:?k
& whl'(!k+1:~>!i:?k&put$"*")
& put$\n
)
&
);

Brainf***[edit]

>>+++++++[>++++++[>+<-]<-]       place * in cell 3
+++++[>++[>>+<<-]<-]<< place \n in cell 4
+++++[ set outer loop count
[>+ increment inner counter
>[-]>[-]<<[->+>+<<]>>[-<<+>>]<< copy inner counter
>[>>.<<-]>>>.<<< print line
<<-] end inner loop
] end outer loop

Brat[edit]

1.to 5, { i |
1.to i, { j |
print "*"
}
print "\n"
}

C[edit]

int i, j;
for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++)
putchar('*');
puts("");
}

C++[edit]

for(int i = 1; i <= 5; ++i) {
for(int j = 1; j <= i; j++)
std::cout << "*";
std::cout << std::endl;
}

C#[edit]

using System;
 
class Program {
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
}

Ceylon[edit]

shared void run() {
 
for(i in 1..5) {
for(j in 1..i) {
process.write("*");
}
print("");
}
}

Chapel[edit]

for i in 1..5 {
for 1..i do write('*');
writeln();
}

Chef[edit]

Asterisks Omelette.
 
This recipe prints a triangle of asterisks.
 
Ingredients.
5 eggs
1 onion
1 potato
42 ml water
10 ml olive oil
1 garlic
 
Method.
Put eggs into the mixing bowl.
Fold onion into the mixing bowl.
Put eggs into the mixing bowl.
Add garlic into the mixing bowl.
Fold eggs into the mixing bowl.
Chop onion.
Put onion into the mixing bowl.
Fold potato into the mixing bowl.
Put olive oil into the mixing bowl.
Mash potato.
Put water into the mixing bowl.
Mash potato until mashed.
Chop onion until choped.
Pour contents of the mixing bowl into the baking dish.
 
Serves 1.

COBOL[edit]

       IDENTIFICATION DIVISION.
PROGRAM-ID. Display-Triangle.
 
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Outer-Counter PIC 9.
01 Inner-Counter PIC 9.
 
PROCEDURE DIVISION.
PERFORM VARYING Outer-Counter FROM 1 BY 1 UNTIL 5 < Outer-Counter
 
PERFORM VARYING Inner-Counter FROM 1 BY 1
UNTIL Outer-Counter < Inner-Counter
DISPLAY "*" NO ADVANCING
END-PERFORM
 
DISPLAY "" *> Output a newline
END-PERFORM
 
GOBACK
.
 

Coq[edit]

Section FOR.
Variable T : Type.
Variable body : nat -> T -> T.
Variable start : nat.
 
Fixpoint for_loop n : T -> T :=
match n with
| O => fun s => s
| S n' => fun s => for_loop n' (body (start + n') s)
end.
 
End FOR.
 
Eval vm_compute in
for_loop _
(fun i =>
cons
(for_loop _
(fun j => cons tt)
0 (S i) nil
)
)
0 5 nil.
 

Clojure[edit]

(doseq [i (range 5), j (range (inc i))]
(print "*")
(if (= i j) (println)))

ColdFusion[edit]

Remove the leading space from the line break tag.

With tags:

<cfloop index = "i" from = "1" to = "5">
<cfloop index = "j" from = "1" to = "#i#">
*
</cfloop>
< br />
</cfloop>

With script:

<cfscript>
for( i = 1; i <= 5; i++ )
{
for( j = 1; j <= i; j++ )
{
writeOutput( "*" );
}
writeOutput( "< br />" );
}
</cfscript>

Common Lisp[edit]

(loop for i from 1 upto 5 do
(loop for j from 1 upto i do
(write-char #\*))
(write-line ""))
(dotimes (i 5)
(dotimes (j (+ i 1))
(write-char #\*))
(terpri))
(do ((i 1 (+ i 1)))
((> i 5))
(do ((j 1 (+ j 1)))
((> j i))
(write-char #\*))
(terpri))

D[edit]

import std.stdio: write, writeln;
 
void main() {
for (int i; i < 5; i++) {
for (int j; j <= i; j++)
write("*");
writeln();
}
writeln();
 
foreach (i; 0 .. 5) {
foreach (j; 0 .. i + 1)
write("*");
writeln();
}
}
Output:
*
**
***
****
*****

*
**
***
****
*****

Dao[edit]

for( i = 1 : 5 ){
for( j = 1 : i ) io.write( '*' )
io.writeln()
}

Dart[edit]

main() {
for (var i = 0; i < 5; i++)
for (var j = 0; j < i + 1; j++)
print("*");
print("\n");
}

dc[edit]

[...]sA defines the inner loop A and [...]sB defines the outer loop B. This program nests the entrance to loop A inside loop B.

Translation of: bc
[
[*]P [print asterisk]sz
lj 1 + d sj [increment j, leave it on stack]sz
li !<A [continue loop if i >= j]sz
]sA
[
1 d sj [j = 1, leave it on stack]sz
li !<A [enter loop A if i >= j]sz
[
]P [print newline]sz
li 1 + d si [increment i, leave it on stack]sz
5 !<B [continue loop if 5 >= i]sz
]sB
1 d si [i = 1, leave it on stack]sz
5 !<B [enter loop B if 5 >= i]sz

Delphi[edit]

program LoopFor;
 
{$APPTYPE CONSOLE}
 
var
i, j: Integer;
begin
for i := 1 to 5 do
begin
for j := 1 to i do
Write('*');
Writeln;
end;
end.

DWScript[edit]

var i, j : Integer;
 
for i := 1 to 5 do begin
for j := 1 to i do
Print('*');
PrintLn('');
end;

dodo0[edit]

fun for -> var, test, body, return    # define a for loop using recursion
(
test(var) -> continue
if (continue) ->
(
body(var) -> var
for (var, test, body, return)
)
|
return(var)
)
| for
 
fun upToFive (-> index, return) '<='(index, 5, return) | upToFive
 
for (1, upToFive) -> index, return
(
fun countTheStars -> stars, return
(
'count'(stars) -> n
'<'(n, index, return) # continue until n = index
)
| countTheStars
 
for ("*", countTheStars) -> prefix, return
'str'(prefix, "*", return)
| stars
 
println(stars) ->
 
'inc'(index, return)
)
| result
exit()

DMS[edit]

number i, j
for (i = 1; i <= 5; i++)
{
for (j = 1; j <= i; j++)
{
Result( "*" )
}
Result( "\n" )
}

E[edit]

for width in 1..5 {
for _ in 1..width {
print("*")
}
println()
}

This loop is a combination of for ... in ... which iterates over something and a..b which is a range object that is iteratable. (Also, writing a..!b excludes the value b.)

Ela[edit]

open monad io
 
loop m n | n < m = do
loop' n 0
putStrLn ""
loop m (n + 1)
| else = do return ()
where loop' m n | n <= m = do
putStr "*"
loop' m (n + 1)
| else = do return ()
 
_ = loop 10 1 ::: IO


Output:

**
***
****
*****
******
*******
********
*********
**********

EGL[edit]

str string;
for ( i int to 5 )
str = "";
for ( j int to i )
str += "*";
end
SysLib.writeStdout(str);
end

Elena[edit]

#import system.
#import extensions.
 
#symbol program =
[
0 till:5 &doEach:i
[
0 to:i &doEach:j
[ console write:"*". ].
 
console writeLine.
].
].
 

Elixir[edit]

defmodule Loops do
def loops_for(n) do
Enum.each(1..n, fn i ->
Enum.each(1..i, fn _ -> IO.write "*" end)
IO.puts ""
end)
end
end
 
Loops.loops_for(5)

Erlang[edit]

%% Implemented by Arjun Sunel
-module(nested_loops).
-export([main/0, inner_loop/0]).
 
main() ->
outer_loop(1).
 
inner_loop()->
inner_loop(1).
 
inner_loop(N) when N rem 5 =:= 0 ->
io:format("* ");
 
inner_loop(N) ->
io:fwrite("* "),
inner_loop(N+1).
 
outer_loop(N) when N rem 5 =:= 0 ->
io:format("*");
 
outer_loop(N) ->
outer_loop(N+1),
io:format("~n"),
inner_loop(N).
 


ERRE[edit]

 
FOR I=1 TO 5 DO
FOR J=1 TO I DO
PRINT("*";)
END FOR
PRINT
END FOR
 

Euphoria[edit]

 
for i = 1 to 5 do
for j = 1 to i do
puts(1, "*") -- Same as "puts(1, {'*'})"
end for
puts(1, "\n") -- Same as "puts(1, {'\n'})"
end for
 

puts() is a function that takes two arguments; an integer and a sequence. Strings are simply sequences; there is no string type. The integer specifies where to put the "string". 0 = STDIN, 1 = STDOUT, 2 = STDERR, 3+ = files that are opened with the open() function. puts() prints the sequence out, as a "string". Each element in the sequence provided is printed out as the character with that value in the ASCII character chart.

FALSE[edit]

1[$6-][$[$]["*"1-]#%"
"1+]#%

Factor[edit]

5 [1,b] [ [ "*" write ] times nl ] each

Fantom[edit]

Using for loops:

 
class ForLoops
{
public static Void main ()
{
for (Int i := 1; i <= 5; ++i)
{
for (Int j := 1; j <= i; ++j)
{
Env.cur.out.print ("*")
}
Env.cur.out.printLine ("")
}
}
}
 

Using range objects:

 
class ForLoops
{
public static Void main ()
{
(1..5).each |i|
{
(1..i).each |j|
{
Env.cur.out.print ("*")
}
Env.cur.out.printLine ("")
}
}
}
 

Forth[edit]

: triangle ( n -- )
1+ 1 do
cr i 0 do [char] * emit loop
loop ;
5 triangle

One more:

 
: limit_example
15 1 do r> r@ dup rot >r drop \ Bring limit on stack
. \ And print it
loop ;
\ Gforth and JSForth all work, SP-Forth brakes (different 'for' implementation?)
 

Fortran[edit]

Works with: Fortran version 77 and later
C     WARNING: This program is not valid ANSI FORTRAN 77 code. It uses
C one nonstandard character on the line labelled 5001. Many F77
C compilers should be okay with it, but it is *not* standard.
PROGRAM FORLOOP
INTEGER I, J
 
DO 20 I = 1, 5
DO 10 J = 1, I
C Print the asterisk.
WRITE (*,5001) '*'
10 CONTINUE
C Print a newline.
WRITE (*,5000) ''
20 CONTINUE
 
STOP
 
5000 FORMAT (A)
C Standard FORTRAN 77 is completely incapable of completing a
C WRITE statement without printing a newline. If you wanted to
C write this program in valid F77, you would have to come up with
C a creative way of printing varying numbers of asterisks in a
C single write statement.
C
C The dollar sign at the end of the format is a nonstandard
C character. It tells the compiler not to print a newline. If you
C are actually using FORTRAN 77, you should figure out what your
C particular compiler accepts. If you are actually using Fortran
C 90 or later, you should replace this line with the commented
C line that follows it.
5001 FORMAT (A, $)
C5001 FORMAT (A, ADVANCE='NO')
END
Works with: Fortran version 90 and later
DO i = 1, 5
DO j = 1, i
WRITE(*, "(A)", ADVANCE="NO") "*"
END DO
WRITE(*,*)
END DO

Fortran 95 (and later) has also a loop structure that can be used only when the result is independent from real order of execution of the loop.

Works with: Fortran version 95 and later
integer :: i
integer, dimension(10) :: v
 
forall (i=1:size(v)) v(i) = i

But if one accepts that a do-loop can be expressed without the actual word "do" (or "for"), then

 
DO 1 I = 1,5
1 WRITE (6,*) ("*", J = 1,I)
END
 

That is a complete programme, though a more polite source file would have INTEGER I,J. It uses the old-style DO label etc. style of DO-loop to save on having to specify an END DO. The WRITE statement's output list is generated by an "implied" DO-loop having much of the form of DO J = 1,I and is indeed a proper loop. The output item is a text literal, which in earlier Fortran was unknown, however the result can still be achieved:

 
DO 1 I = 1,5
1 WRITE (6,2) (666, J = 1,I)
2 FORMAT(5I1)
END
 

This works because if a value cannot be fitted into its output field, the field is filled with asterisks. Which, is what is wanted! Just allow one digit for output (I1), and present a large integer.

Frink[edit]

 
for n = 1 to 5
{
for a = 1 to n
print["*"]
 
println[]
}
 

F#[edit]

#light
[<EntryPoint>]
let main args =
for i = 1 to 5 do
for j = 1 to i do
printf "*"
printfn ""
0

Gambas[edit]

for i = 1 to 5
for j = 1 to i
print "*";
next
print
next

GAP[edit]

for i in [1 .. 5] do
for j in [1 .. i] do
Print("*");
od;
Print("\n");
od;
 
# *
# **
# ***
# ****
# *****

GML[edit]

pattern = ""
for(i = 1; i <= 5; i += 1)
{
for(j = 1; j <= i; j += 1)
{
pattern += "*"
}
pattern += "#"
}
show_message(pattern)

Go[edit]

package main
 
import "fmt"
 
func main() {
for i := 1; i <= 5; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("*")
}
fmt.Printf("\n")
}
}
Output:
*
**
***
****
*****

Groovy[edit]

Solution:

for(i in (1..6)) {
for(j in (1..i)) {
print '*'
}
println ()
}

Hack[edit]

for($i = 0; $i < 5; $i++) {
for($j = 0; $j <= $i; $j++) {
echo '*';
}
 
echo '\n';
}

Haxe[edit]

for (i in 1...6) {
for(j in 0...i) {
Sys.print('*');
}
Sys.println('');
}

Haskell[edit]

import Control.Monad
 
main = do
forM_ [1..5] $ \i -> do
forM_ [1..i] $ \j -> do
putChar '*'
putChar '\n'

But it's more Haskellish to do this without loops:

import Data.List (inits)
 
main = mapM_ putStrLn $ tail $ inits $ replicate 5 '*'

HicEst[edit]

DO i = 1, 5
DO j = 1, i
WRITE(APPend) "*"
ENDDO
WRITE() ' '
ENDDO

Icon and Unicon[edit]

Icon[edit]

procedure main()
every i := 1 to 5 do {
every 1 to i do
writes("*")
write()
}
end

Unicon[edit]

The Icon solution works in Unicon.

Inform 7[edit]

repeat with length running from 1 to 5:
repeat with N running from 1 to length:
say "*";
say line break;

J[edit]

J is array-oriented, so there is very little need for loops. For example, except for the requirement for loops, one could satisfy this task this way:

  ]\ '*****'

J does support loops for those times they can't be avoided (just like many languages support gotos for those time they can't be avoided).

3 : 0
for_i. 1 + i. y do.
z =. ''
 
for. 1 + i. i do.
z=. z,'*'
end.
 
z 1!:2 ] 2
end.
 
i.0 0
)

But you would almost never see J code like this.

Java[edit]

for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}

JavaScript[edit]

var i, j;
for (i = 1; i <= 5; i += 1) {
s = '';
for (j = 0; j < i; j += 1)
s += '*';
document.write(s + '<br>');
}


Alternatively, using JavaScript's Array.forEach(), and given an array of indices, or a simple range function which generates a range:

function range(i) {
return i ? range(i - 1).concat(i) : [];
}
 
range(5) --> [1, 2, 3, 4, 5]

We could write something like:

var s = '';
 
range(5).forEach(
function (line) {
range(line).forEach(
function () { s += '*'; }
);
s += '\n';
}
);
 
console.log(s);

but it might be more natural in JavaScript, if we are going to use built-in Array functions, to simplify a little with Array.reduce(), writing:

console.log(
range(5).reduce(
function (a, n) {
return a + Array(n + 1).join('*') + '\n';
}, ''
)
);

in which the inner n refers to the Array value visited at the next level out, and the triangle is returned as a single expression, rather than as a series of variable mutations.

Finally, in contexts where an expression composes better than a statement, the effect of a loop can often be expressed as a map.

console.log(
range(5).map(function(a) {
return Array(a + 1).join('*');
}).join('\n')
);

jq[edit]

# Single-string version using explicit nested loops:
def demo(m):
reduce range(0;m) as $i
(""; reduce range(0;$i) as $j
(.; . + "*" ) + "\n" ) ;
 
# Stream of strings:
def demo2(m):
range(1;m)
| reduce range(0;.) as $j (""; . + "*");
 
# Variation of demo2 using an implicit inner loop:
def demo3(m): range(1;m) | "*" * . ;

Example using demo(6)

Output:
$ jq -r -n -f loops_for.jq
*
**
***
****
*****

Julia[edit]

 
for i in 1:5
for j in 1:i
print("*")
end
println()
end
 
Output:
*
**
***
****
*****

LabVIEW[edit]

This image is a VI Snippet, an executable image of LabVIEW code. The LabVIEW version is shown on the top-right hand corner. You can download it, then drag-and-drop it onto the LabVIEW block diagram from a file browser, and it will appear as runnable, editable code.
LabVIEW Loops For.png

Lang5[edit]

: cr  "\n" . ;      : dip  swap '_ set execute _ ;
: nip swap drop ;  : last -1 extract nip ;
: times
swap iota '_ set
do dup 'execute dip _ last 0 == if break then
loop drop ;
 
: concat "" join ;
'* 1 5 "2dup reshape concat . cr 1 +" times


Lasso[edit]

loop(5) => {^
loop(loop_count) => {^ '*' ^}
'\r'
^}

LC3 Assembly[edit]

      .ORIG      0x3000
 
AND R1,R1,0
ADD R1,R1,1
AND R5,R5,0
ADD R5,R5,5
NOT R5,R5
 
LOOPI LD R0,STAR
AND R2,R2,0
ADD R3,R1,0
 
LOOPJ OUT
ADD R2,R2,1
NOT R4,R2
ADD R4,R3,R4
BRZP LOOPJ
 
LD R0,LF
OUT
 
ADD R1,R1,1
ADD R4,R1,R5
BRN LOOPI
 
HALT
 
STAR .FILL 0x2A
LF .FILL 0x0A
 
.END

Output:

*
**
***
****
*****

Lisaac[edit]

1.to 5 do { i : INTEGER;
1.to i do { dummy : INTEGER;
'*'.print;
};
'\n'.print;
};

LiveCode[edit]

put 0 into n
repeat for 5 times
add 1 to n
repeat for n times
put "*"
end repeat
put return
end repeat

[edit]

for [i 1 5] [repeat :i [type "*] (print)]
repeat 5 [repeat repcount [type "*] (print)]

Lua[edit]

 
for i=1,5 do
for j=1,i do
io.write("*")
end
io.write("\n")
end
 

M4[edit]

define(`for',
`ifelse($#,0,``$0'',
`ifelse(eval($2<=$3),1,
`pushdef(`$1',$2)$5`'popdef(`$1')$0(`$1',eval($2+$4),$3,$4,`$5')')')')dnl
 
for(`x',`1',`5',`1',
`for(`y',`1',x,`1',
`*')
')

make[edit]

Works with: BSD make
Library: jot
all: line-5
 
ILIST != jot 5
.for I in $(ILIST)
 
line-$(I): asterisk-$(I)-$(I)
@echo
 
JLIST != jot $(I)
. for J in $(JLIST)
 
. if "$(J)" == "1"
. if "$(I)" == "1"
asterisk-1-1:
. else
IM != expr $(I) - 1
asterisk-$(I)-1: line-$(IM)
. endif
. else
JM != expr $(J) - 1
asterisk-$(I)-$(J): asterisk-$(I)-$(JM)
. endif
@printf \*
 
. endfor
.endfor

Maple[edit]

> for i to 5 do to i do printf( "*" ) end; printf( "\n" ) end;
*
**
***
****
*****


Mathematica[edit]

n=5;
For[i=1,i<=5,i++,
string="";
For[j=1,j<=i,j++,string=string<>"*"];
Print[string]
]

MATLAB / Octave[edit]

for i = (1:5)
output = [];
for j = (1:i)
output = [output '*'];
end
disp(output);
end

Vectorized version:

for i = (1:5)
disp(repmat('*',1,i));
end

Maxima[edit]

for i thru 5 do (
s: "",
thru i do s: sconcat(s, "*"),
print(s)
);

MAXScript[edit]

for i in 1 to 5 do
(
line = ""
for j in 1 to i do
(
line += "*"
)
format "%\n" line
)

Mercury[edit]

:- module loops_for.
:- interface.
 
:- import_module io.
:- pred main(io::di, io::uo) is det.
 
:- implementation.
:- import_module int.
 
main(!IO) :-
int.fold_up(outer_loop_body, 1, 5, !IO).
 
:- pred outer_loop_body(int::in, io::di, io::uo) is det.
 
outer_loop_body(I, !IO) :-
int.fold_up(inner_loop_body, 1, I, !IO),
io.nl(!IO).
 
:- pred inner_loop_body(int::in, io::di, io::uo) is det.
 
inner_loop_body(_, !IO) :-
io.write_char('*', !IO).

Modula-2[edit]

MODULE For;
IMPORT InOut;
 
VAR
i, j: INTEGER;
 
BEGIN
FOR i := 1 TO 5 DO
FOR j := 1 TO i DO
InOut.Write('*');
END;
InOut.WriteLn
END
END For.

Modula-3[edit]

MODULE Stars EXPORTS Main;
 
IMPORT IO;
 
BEGIN
FOR i := 1 TO 5 DO
FOR j := 1 TO i DO
IO.Put("*");
END;
IO.Put("\n");
END;
END Stars.

MOO[edit]

for i in [1..5]
s = "";
for j in [1..i]
s += "*";
endfor
player:tell(s);
endfor

Morfa[edit]

 
import morfa.base;
 
for (i in 0..5)
{
for (j in 0..i+1)
{
print("*");
}
println("");
}
 

MUMPS[edit]

Routine[edit]

FORLOOP
NEW I,J
FOR I=1:1:5 DO
.FOR J=1:1:I DO
..WRITE "*"
.WRITE !
QUIT
Output:
USER>D FORLOOP^ROSETTA
*
**
***
****
*****

One line[edit]

The if statement has to follow the write, or else the if statement would control the write (5 lines with one asterisk each).

FOR I=1:1:5 FOR J=1:1:I WRITE "*" IF J=I W !

Nemerle[edit]

for (int i = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
{
Write("*");
}
WriteLine();
}

NetRexx[edit]

/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
 
say
say 'Loops/For'
 
loop i_ = 1 to 5
loop for i_
say '*\-'
end
say
end i_
 

NewLISP[edit]

 
(for (i 1 5)
(for(j 1 i)
(print "*"))
(print "\n"))
 

Nim[edit]

for i in 1..5:
for i in 1..i:
stdout.write("*")
echo("")

Oberon-2[edit]

Works with oo2c Version 2

 
MODULE LoopFor;
IMPORT
Out;
VAR
i, j: INTEGER;
 
BEGIN
FOR i := 1 TO 5 DO
FOR j := 1 TO i DO
Out.Char('*');
END;
Out.Ln
END
END LoopFor.
 

Objeck[edit]

 
bundle Default {
class For {
function : Main(args : String[]) ~ Nil {
DoFor();
}
 
function : native : DoFor() ~ Nil {
for (i := 0; i < 5; i += 1;) {
for (j := 0; j <= i; j += 1;) {
"*"->Print();
};
""->PrintLine();
};
}
}
}
 

OCaml[edit]

for i = 1 to 5 do
for j = 1 to i do
print_string "*"
done;
print_newline ()
done

Octave[edit]

for i = 0:1:4
for j = 0:1:i
printf("*");
endfor
printf("\n");
endfor

Oforth[edit]

func: loopFor(n)
{
| i j |
n loop: i [
i loop: j [ "*" print ]
printcr
]
}

Onyx[edit]

1 1 5 {dup {`*'} repeat bdup bpop ncat `\n' cat print} for flush

Using repeat inside the for loop instead of nesting another for loop is shorter and more efficient.

Order[edit]

#include <order/interpreter.h>
 
ORDER_PP(
8for_each_in_range(8fn(8I,
8print(
8for_each_in_range(8fn(8J, 8print((*))),
1, 8plus(8I, 1))
8space)),
1, 6)
)

(Order cannot print newlines, so this example just uses a space.)

Oz[edit]

for I in 1..5 do
for _ in 1..I do
{System.printInfo "*"}
end
{System.showInfo ""}
end

Note: we don't use the inner loop variable, so we prefer not to give it a name.

Panoramic[edit]

 
dim x,y
 
for x=1 to 5
 
for y=1 to x
 
print "*";
 
next y
 
print
 
next x
 

PARI/GP[edit]

for(a=1,5,for(b=1,a,print1("*"));print())

Pascal[edit]

program stars(output);
 
var
i, j: integer;
 
begin
for i := 1 to 5 do
begin
for j := 1 to i do
write('*');
writeln
end
end.

Perl[edit]

for ($x = 1; $x <= 5; $x++) {
for ($y = 1; $y <= $x; $y++) {
print "*";
}
print "\n";
}
foreach (1..5) {
foreach (1..$_) {
print '*';
}
print "\n";
}

However, if we lift the constraint of two loops the code will be simpler:

print ('*' x $_ . "\n") for 1..5

Perl 6[edit]

Works with: Rakudo version #22 "Thousand Oaks"
for ^5 {
 
for 0..$_ {
print "*";
}
 
print "\n";
 
}

or using only one for loop:

say '*' x $_ for 1..5;

or without using any loops at all:

([\~] "*" xx 5).join("\n").say;

Phix[edit]

for i=1 to 5 do
for j=1 to i do
puts(1,"*")
end for
puts(1,"\n")
end for

PHP[edit]

for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo '*';
}
echo "\n";
}

or

foreach (range(1, 5) as $i) {
foreach (range(1, $i) as $j) {
echo '*';
}
echo "\n";
}

PicoLisp[edit]

(for N 5
(do N (prin "*"))
(prinl) )

Pike[edit]

int main(){
for(int i = 1; i <= 5; i++){
for(int j=1; j <= i; j++){
write("*");
}
write("\n");
}
}

PL/I[edit]

Basic version:

do i = 1 to 5;
do j = 1 to i;
put edit ('*') (a);
end;
put skip;
end;

Advanced version:

do i = 1 to 5;
put skip edit (('*' do j = 1 to i)) (a);
end;

Due to the new line requirement a mono line version is not possible

put edit ((('*' do j = 1 to i)do i=1 to 5))(a);  /* no new line */

Pop11[edit]

lvars i, j;
for i from 1 to 5 do
for j from 1 to i do
printf('*','%p');
endfor;
printf('\n')
endfor;

PowerShell[edit]

for ($i = 1; $i -le 5; $i++) {
for ($j = 1; $j -le $i; $j++) {
Write-Host -NoNewline *
}
Write-Host
}

Alternatively the same can be achieved with a slightly different way by using the range operator along with the ForEach-Object cmdlet:

1..5 | ForEach-Object {
1..$_ | ForEach-Object {
Write-Host -NoNewline *
}
Write-Host
}

while the inner loop wouldn't strictly be necessary and can be replaced with simply "*" * $_.

Python[edit]

import sys
for i in xrange(5):
for j in xrange(i+1):
sys.stdout.write("*")
print

Note that we have a constraint to use two for loops, which leads to non-idiomatic Python. If that constraint is dropped we can use the following, more idiomatic Python solution:

for i in range(1,6):
print '*' * i

R[edit]

for(i in 0:4) {
s <- ""
for(j in 0:i) {
s <- paste(s, "*", sep="")
}
print(s)
}

Racket[edit]

(for ([i (in-range 1 6)]) (for ([j i]) (display "*")) (newline))

REBOL[edit]

; Use 'repeat' when an index required, 'loop' when repetition suffices:
 
repeat i 5 [
loop i [prin "*"]
print ""
]
 
; or a more traditional for loop:
 
for i 1 5 1 [
loop i [prin "*"]
print ""
]


REXX[edit]

using concatenation[edit]

/*REXX program demonstrates an outer DO loop controlling the inner DO loop with a "FOR".*/
 
do j=1 for 5 /*this is the same as: do j=1 to 5 */
$= /*initialize the value to a null string*/
do k=1 for j /*only loop for a J number of times*/
$=$ || '*' /*using concatenation (||) for build.*/
end /*k*/
say $ /*display character string being built.*/
end /*j*/
/*stick a fork in it, we're all done. */

output

*
**
***
****
*****

using abutment[edit]

/*REXX program demonstrates an outer DO loop controlling the inner DO loop with a "FOR".*/
 
do j=1 for 5 /*this is the same as: do j=1 to 5 */
$= /*initialize the value to a null string*/
do k=1 for j /*only loop for a J number of times*/
$=$'*' /*using abutment for the construction. */
end /*k*/
say $ /*display character string being built.*/
end /*j*/
/*stick a fork in it, we're all done. */

output   is identical to the 1st REXX version.

Retro[edit]

6 [ 0; cr [ '* emit ] times ] iter

Ring[edit]

can be done in just one line:

 
for i = 1 to 5 for x = 1 to i see "*" next see nl next
 

or multiple line

 
for i = 1 to 5
for x = 1 to i
see "*"
next
see nl
next
 

Ruby[edit]

One can write a for loop as for i in 1..5; ...end or as for i in 1..5 do ... end or as (1..5).each do |i| ... end. All three forms call Range#each to iterate 1..5.

for Range#each
for i in 1..5
for j in 1..i
print "*"
end
puts
end
(1..5).each do |i|
(1..i).each do |j|
print "*"
end
puts
end

Ruby has other ways to code these loops; Integer#upto is most convenient.

Integer#upto Integer#times Kernel#loop
1.upto(5) do |i|
1.upto(i) do |j|
print "*"
end
puts
end
5.times do |i|
# i goes from 0 to 4
(i+1).times do
print "*"
end
puts
end
i = 1
loop do
j = 1
loop do
print "*"
break if (j += 1) > i
end
puts
break if (i += 1) > 5
end

Or we can use String#* as the inner loop, and Enumerable#map as the outer loop. This shrinks the program to one line.

puts (1..5).map { |i| "*" * i }

Rust[edit]

The compiler warns when you create an unused variable; here we use _ to avoid this effect.

for i in 0..5 {
for _ in 0..(i + 1) {
print!("*");
}
 
print!("\n");
}
 

Salmon[edit]

iterate (x; [0...4])
{
iterate (y; [0...x])
print("*");;
print("\n");
};

or

for (x; 0; x < 5)
{
for (y; 0; y <= x)
print("*");;
print("\n");
};


SAS[edit]

data _null_;
length a $5;
do n=1 to 5;
a="*";
do i=2 to n;
a=trim(a) !! "*";
end;
put a;
end;
run;

Sather[edit]

Sather allows the definition of new iterators. Here's we define for! so that it resembles the known for in other languages, even though the upto! built-in can be used.

class MAIN is
-- from, to, step
for!(once init:INT, once to:INT, once inc:INT):INT is
i ::= init;
loop while!( i <= to );
yield i;
i := i + inc;
end;
end;
 
main is
i, j :INT;
loop i := for!(1, 5, 1); -- 1.upto!(5)
loop j := for!(1, i, 1); -- 1.upto!(i)
#OUT + "*";
end;
#OUT + "\n";
end;
end;
end;
 

Scheme[edit]

(do ((i 1 (+ i 1)))
((> i 5))
(do ((j 1 (+ j 1)))
((> j i))
(display "*"))
(newline))

Scilab[edit]

Works with: Scilab version 5.5.1
for i=1:5
s=""
for j=1:i
s=s+"*"
end
printf("%s\n",s)
end
Output:
*
**
***
****
*****

Seed7[edit]

for I range 1 to 5 do
for J range 1 to I do
write("*");
end for;
writeln;
end for;

Sidef[edit]

for(;;) loop:

for (var i = 1; i <= 5; i++) {
for (var j = 1; j <= i; j++) {
print '*'
}
print "\n"
}

for([]) loop:

for (1..5) { |i|
for (1..i) { print '*' }
print "\n"
}

for-in loop:

for i in (1..5) {
for j in (1..i) { print '*' }
print "\n"
}

Idiomatic:

5.times { |i|
i.times { print '*' }
print "\n"
}

Slate[edit]

1 to: 5 do: [| :n | inform: ($* repeatedTimes: n)].

Scala[edit]

for (i <- 1 to 5) {
for (j <- 1 to i)
print("*")
println
}

Simula[edit]

Works with: SIMULA-67
FOR I:=1 UNTIL 5 DO
FOR J:=1 UNTIL I DO
OUTTEXT("*");
OUTLINE

Smalltalk[edit]

1 to: 5 do: [ :aNumber |
aNumber timesRepeat: [ '*' display ].
Character nl display.
]

or:

1 to: 5 do: [ :row |
1 to: row do: [:col | '*' display ].
]

(only for demonstration of nested for-loops; as the column is not needed, the first solution is probably clearer).

However, streams already have some builtin repetition mechanism, so a programmer might write:

Works with: Smalltalk/X
1 to: 5 do: [ :n |
Stdout next: n put: $*; cr
]

SNOBOL4[edit]

A slightly longer, "mundane" version

ol	outer = ?lt(outer,5) outer + 1	:f(end)
inner = outer; stars = ""
il stars = ?gt(inner,0) stars "*" :f(disp)
inner = inner - 1 :(il)
disp output = stars; :(ol)
end

The "real SNOBOL4" starts here:

outer	b = a = ?lt(a,5) a + 1	:f(end)
inner t = t ?(b = (gt(b,0) b - 1)) "*" :s(inner)
t span("*") . terminal = :(outer)
end

one "loop" only:

	a = "*****"; 
a a len(x = x + 1) . output :s(a)
end

... or just (courtesy of GEP2):

Works with: SNOBOL4 version which defaults to anchored mode
        "*****" arb $ output fail
end

Sparkling[edit]

for (var row = 1; row <= 5; row++) {
for (var col = 1; col <= row; col++) {
printf("*");
}
 
print();
}

Suneido[edit]

for(i = 0; i < 5; ++i)
{
str = ''
for (j = 0; j <= i; ++j)
str $= '*'
Print(str)
}

Swift[edit]

for i in 1...5 {
for j in 1...i {
print("*")
}
println()
}
Output:
*
**
***
****
*****

Alternately:

for i in 1..<6 {
for j in 1..<i+1 {
print("*")
}
println()
}
Output:
*
**
***
****
*****

Alternately (removed in Swift 3):

for var i = 1; i <= 5; i++ {
for var j = 1; j <= i; j++ {
print("*")
}
println()
}
Output:
*
**
***
****
*****

Tcl[edit]

for {set lines 1} {$lines <= 5} {incr lines} {
for {set i 1} {$i <= $lines} {incr i} {
puts -nonewline "*"
}
puts ""
}

Note that it would be more normal to produce this output with:

for {set i 1} {$i <= 5} {incr i} {
puts [string repeat "*" $i]
}

It bears noting that the three parts of the for loop do not have to consist of "initialize variable", "test value of variable" and "increment variable". This is a common way to think of it as it resembles the "for" loop in other languages, but many other things make sense. For example this for-loop will read a file line-by-line:

set line ""
for { set io [open test.txt r] } { ![eof $io] } { gets $io line } {
if { $line != "" } { ...do something here... }
}

(This is a somewhat awkward example; just to show what is possible)

TI-83 BASIC[edit]

For loops in TI-83 BASIC take at least 3 arguments, with an optional fourth: For(variable,start,end[,step]. Parentheses don't need to be closed in TI-BASIC.

ClrHome
For(I,1,5
For(J,1,I
Output(I,J,"*
End
End

TI-89 BASIC[edit]

Local i,j
ClrIO
For i, 1, 5
For j, 1, i
Output i*8, j*6, "*"
EndFor
EndFor

TorqueScript[edit]

for(%i = 0; %i < 5; %i++)
{
for(%x = %i; %x < 5; %x++)
{
 %string = %string @ "*";
echo(%string);
}
}

TUSCRIPT[edit]

 
$$ MODE TUSCRIPT
m=""
LOOP n=1,5
m=APPEND (m,"","*")
PRINT m
ENDLOOP
 
Output:
*
**
***
****
***** 

UNIX Shell[edit]

A conditional loop, using a while control construct, can have the same effect as a for loop. (The original Bourne Shell has no echo -n "*", so this uses printf "*".)

Works with: Bourne Shell
#!/bin/sh
# Using a while control construct to emulate a for loop
 
l="1" # Set the counters to one
while [ "$l" -le 5 ] # Loop while the counter is less than five
do
m="1"
while [ "$m" -le "$l" ] # Loop while the counter is less than five
do
printf "*"
m=`expr "$m" + 1` # Increment the inner counter
done
echo
l=`expr "$l" + 1` # Increment the outer counter
done

The Bourne Shell has a for loop, but it requires a list of words to iterate. The jot(1) command from BSD can output an appropriate list of numbers.

Works with: Bourne Shell
Library: jot
for i in `jot 5`; do
for j in `jot $i`; do
printf \*
done
echo
done

Bash has for loops that act like C. These loops are very good for this task.

Works with: Bourne Again SHell version 3
for (( x=1; $x<=5; x=$x+1 )); do 
for (( y=1; y<=$x; y=$y+1 )); do
echo -n '*'
done
echo ""
done

C Shell[edit]

Library: jot
foreach i (`jot 5`)
foreach j (`jot $i`)
echo -n \*
end
echo ""
end

UnixPipes[edit]

yes \ | cat -n | (while read n ; do
[ $n -gt 5 ] && exit 0;
yes \* | head -n $n | xargs -n $n echo
done)

Vedit macro language[edit]

for (#1 = 1; #1 <= 5; #1++) {
for (#2 = 1; #2 <= #1; #2++) {
Type_Char('*')
}
Type_Newline
}

Wart[edit]

for i 1 (i <= 5) ++i
for j 0 (j < i) ++j
pr "*"
(prn)

XLISP[edit]

The equivalent of other languages' FOR or DO loops can be written using DO:

(DO ((I 1 (+ I 1))) ((> I 5))
(DO ((J 0 (+ J 1))) ((= J I))
(DISPLAY "*"))
(NEWLINE))
Output:
*
**
***
****
*****

This construct is not, however, very idiomatic: loops in XLISP are mostly written using recursion.

XPL0[edit]

code ChOut=8, CrLf=9;
int I, J;
for I:= 1 to 5 do
[for J:= 1 to I do
ChOut(0, ^*);
CrLf(0);
]

Z80 Assembly[edit]

For the Amstrad CPC (should work with e.g. the built-in assembler in JavaCPC; use call &4000 to start from BASIC):

org &4000		; put code at memory address 0x4000
wr_char equ &bb5a ; write ASCII character in register A to screen
; (jumps into CPC ROM)
 
; put registers on stack so we can return to BASIC later
push bc
push de
push hl
 
ld b,5 ; loop from 5 to 1
 
row:
 
push bc ; save outer loop variable
 
; calculate inner loop limit (6 - outer loop variable)
ld a,6
sub b
ld b,a
 
column:
 
ld a,42 ; asterisk in ASCII
call wr_char
djnz column ; decrement B, jump to label if non-zero
 
pop bc ; restore outer loop
 
; print carriage return/line feed
ld a,13
call wr_char
ld a,10
call wr_char
 
djnz row
 
; restore registers
pop hl
pop de
pop bc
ret ; return to BASIC interpreter

zkl[edit]

foreach i in ([1..5]){
foreach j in (i){print("*")}
println();
}
Output:
*
**
***
****
*****