.data
shouldbe0:	.asciiz "Should be 0, and it is: "
shouldbe1:	.asciiz "Should be 1, and it is: "
shouldbe4:	.asciiz "Should be 4, and it is: "
shouldbe6:	.asciiz "Should be 6, and it is: "

.text
main:
	la	$a0, shouldbe1
	jal	print_str
	li	$a0, 4
	li	$a1, 0
	jal	nchoosek		# evaluate C(4,0); should be 1
	move	$a0, $v0
	jal	print_int
	jal	print_newline

	la	$a0, shouldbe4
	jal	print_str
	li	$a0, 4
	li	$a1, 1
	jal	nchoosek		# evaluate C(4,1); should be 4
	move	$a0, $v0
	jal	print_int
	jal	print_newline

	la	$a0, shouldbe6
	jal	print_str
	li	$a0, 4
	li	$a1, 2
	jal	nchoosek		# evaluate C(4,2); should be 6
	move	$a0, $v0
	jal	print_int
	jal	print_newline
	
	la	$a0, shouldbe4
	jal	print_str
	li	$a0, 4
	li	$a1, 3
	jal	nchoosek		# evaluate C(4,3); should be 4
	move	$a0, $v0
	jal	print_int
	jal	print_newline

	la	$a0, shouldbe1
	jal	print_str
	li	$a0, 4
	li	$a1, 4
	jal	nchoosek		# evaluate C(4,4); should be 1
	move	$a0, $v0
	jal	print_int
	jal	print_newline

	la	$a0, shouldbe0
	jal	print_str
	li	$a0, 4
	li	$a1, 5
	jal	nchoosek		# evaluate C(4,5); should be 0
	move	$a0, $v0
	jal	print_int
	jal	print_newline

	li	$v0, 10
	syscall

# calculate C($a0,$a1)
nchoosek:
	# prologue
	### YOUR CODE HERE ###
    
	beq	$a1, $0, return1
	beq	$a0, $a1, return1
	beq	$a0, $0, return0
	blt	$a0, $a1, return0

	addi	$a0, $a0, -1		# C(n,k) = C(n-1,k) + C(n-1,k-1)
	move	$s0, $a0
	move	$s1, $a1
	jal	nchoosek
	move	$s2, $v0
	move	$a0, $s0
	addi	$a1, $s1, -1
	jal	nchoosek
	add	$v0, $v0, $s2
	j	return
return0:
	move	$v0, $0
	j	return
return1:
	addi	$v0, $0, 1

return:
	# epilogue
	### YOUR CODE HERE ###

print_int:
	li	$v0, 1
	syscall
	jr	$ra

print_str:
	li	$v0, 4
	syscall
	jr	$ra
	
print_newline:
	li	$a0, '\n'
	li	$v0, 11
	syscall
	jr	$ra
