Definitions

   The factorial of   0   (zero)   is defined as being   1   (unity).
   The   Factorial Function   of a positive integer,    n,    is defined as the product of the sequence:
                 n,   n-1,   n-2,   ...   1 



Task

Write a function to return the factorial of a number.

Solutions can be iterative or recursive.

Support for trapping negative    n    errors is optional.



Related task

   Primorial numbers


 
##################################
# Factorial; iterative           #
# By Keith Stellyes :)           #
# Targets Mars implementation    #
# August 24, 2016                #
##################################
 
# This example reads an integer from user, stores in register a1
# Then, it uses a0 as a multiplier and target, it is set to 1
 
# Pseudocode:
# a0 = 1
# a1 = read_int_from_user()
# while(a1 > 1)
# {
# a0 = a0*a1
# DECREMENT a1
# }
# print(a0)
 
.text ### PROGRAM BEGIN ###
	### GET INTEGER FROM USER ###
	li $v0, 5 #set syscall arg to READ_INTEGER
	syscall #make the syscall
	move $a1, $v0 #int from READ_INTEGER is returned in $v0, but we need $v0
	              #this will be used as a counter
 
	### SET $a1 TO INITAL VALUE OF 1 AS MULTIPLIER ###
	li $a0,1
 
	### Multiply our multiplier, $a1 by our counter, $a0 then store in $a1 ###
loop:	ble $a1,1,exit # If the counter is greater than 1, go back to start
	mul $a0,$a0,$a1 #a1 = a1*a0
 
	subi $a1,$a1,1 # Decrement counter
 
	j loop # Go back to start
 
exit: 
	### PRINT RESULT ###
	li $v0,1 #set syscall arg to PRINT_INTEGER
	#NOTE: syscall 1 (PRINT_INTEGER) takes a0 as its argument. Conveniently, that
	#      is our result. 
	syscall  #make the syscall
 
	#exit
	li $v0, 10 #set syscall arg to EXIT
	syscall #make the syscall
 