26997 total geeks with 3514 solutions
Recent challengers:
 Welcome, you are an anonymous user! [register] [login] Get a yourname@osix.net email address 

Articles

GEEK

User's box
Username:
Password:

Forgot password?
New account

Shoutbox
timsattemme
[b][url=http ://www.lvlux uryoutlet.co m/]louis vuit<strong> <a href="http:/ /www.lvluxur youtlet.com/ ">louis vuitton outlet online</a></ strong> <br> <strong><a href="http:/ /www.lvluxur youtlet.com/ ">louis vuitton store</a></s trong> <br>
timsattemme
[b][url=http ://www.cheap -swisswatche s.com/]swiss <strong><a href="http:/ /www.cheap-s wisswatches. com/">swiss replica watches</a>< /strong> <br > <strong><a href="http:/ /www.cheap-s wisswatches. com/">replic a watches</a>< /strong> <br >
timsattemme
<ul><li><str ong><a href="http:/ /www.cheap-s wisswatches. com/">best replica watches site</a></st rong> </li>< li><strong>< a href="http:/ /www.cheap-s wisswatches. com/">swiss Mechanical movement replica watches</a>< /strong> </l i><li><stron g><a href="http:/ /www.c
timsattemme
<strong><a href="http:/ /www.1nate.n et/">lv bag charms</a></ strong> <br> <strong><a href="http:/ /www.1nate.n et/">lv outlet store</a></s trong> <br> <strong><a href="http:/ /www.1nate.n et/">louis vuitton outlet</a></ strong> <br> <br> <title>Noefu ll MM - $22
timsattemme
[b][url=http ://www.maxun dmoritz-show .com/womens- nfl-jerseys- c-21.ht<stro ng><a href="http:/ /www.maxundm oritz-show.c om/womens-nf l-jerseys-c- 21.html">Wom en's NFL Jerseys</a>< /strong> <br > <strong><a href="http:/ /www.maxundm oritz-show.c om/womens-nf l-jerseys-c

Donate
Donate and help us fund new challenges
Donate!
Due Date: Sep 30
September Goal: $40.00
Gross: $0.00
Net Balance: $0.00
Left to go: $40.00
Contributors


News Feeds
The Register
Rubish WPS config
sees WiFi router
keys popped in
seconds
Virgin Media blocks
"wankers" from
permissable
passwords
Hot students,
"liquid coolant",
bagpipes and
Brazilians: It"s a
cluster compo,
folks
European Commission
okays Oracle"s
MICROS gobble
Broadcom reveals
$20 "Pi in the sky"
IoT development
widget
Yahoo!
YUI!
project!
is!
no!
more!
Facebook, Google
and Instagram
"worse than drugs"
says Miley Cyrus
Drone-maker slapped
for illegal exports
Redmond holds out
on e-mail handover
order
Hardkernel nixes
RPi clone project
Slashdot
Apple Said To Team
With Visa,
MasterCard On
iPhone Wallet
Grand Ayatollah
Says High Speed
Internet Is
"Against Moral
Standards"
XKCD Author"s
Unpublished Book
Remains a
Best-Seller For 5
Months
Yahoo Stops New
Development On YUI
The Apache Software
Foundation Now
Accepting BitCoin
For Donations
DNA Reveals History
of Vanished
"Paleo-Eskimos"
Feds Want Nuclear
Waste Train, But
Don"t Know Where It
Would Go
Ukraine Asks
Zuckerberg to
Discipline Kremlin
Facebook Bots
Update: Raspberry
Pi-Compatible
Development Board
Cancelled
Feynman Lectures
Released Free
Online
Article viewer

Simple Recursion in Scheme



Written by:rae
Published by:SAJChurchey
Published on:2008-11-21 06:07:51
Topic:Common Lisp
Search OSI about Common Lisp.More articles by rae.
 viewed 14444 times send this article printer friendly

Digg this!
    Rate this article :
Understanding recursion and how to implement it to solve problems using classical examples in functional programming.

Recursion is a term used to describe a function calling itself. It is an important concept in programming and doubly so in Lisp and its dialects. To understand recursion, we turn to Scheme - a minimalistic dialect of Lisp. Since this article assumes basic familiarity with Lisp/Scheme syntax, we'll directly jump into looking at our first code.

(define (sum-of-list my-list)
  (cond
    [(empty? my-list) 0]
    [else (+ (first my-list) (sum-of-list (rest my-list)))]))


The above function sum-of-list consumes a list of numbers and produces an output which is the sum of all numbers in the list. Thus,

(sum-of-list '(1 34 5)) => 40


Note that in the above call, we use list abbreviations using the quoted syntax instead of using the cons syntax.

Dissecting sum-of-list we see that it defines a conditional where the output of an empty list, i.e. '() would evaluate to 0. This makes sense because giving it an input of a list with no elements would mean that the sum of the numbers of this list would be 0.

The interesting part comes in the else part of the conditional. If the list is non-empty like in our case of (1 34 5), the list is broken up into two - an atomic value consisting of the first element of the list extracted by the first operator, and the second part is again a list consisting of everything but the first element of the list in question. This is done using the rest operator.

Note that the first and rest operators are the Scheme equivalents of car and cdr of Lisp.

The operation that is being carried out here is addition since we want the sum of the elements of the list. The first atomic element is to be added to the resultant of (sum-of-list (rest my-list)) which is by our definition a recursive call. Note that the same procedure is being called again without the first element. So, after the first pass, the operation which will be called will be



(sum-of-list '(34 5))




This function call will then in turn go through the same process, each time splitting the list into its first element and the rest of the list till it splits the list into its last element and an empty list, thereby satisfying the first conditional and returning 0. These results are then added up starting from 0 to the first element of the list in reverse order. This process in the end would return us the summation of the list in question, i.e. 40.


We now look at another problem which is commonly solved by recursion - computing the factorial of a number. Here is a recursive Scheme program for the same using the lambda procedure.



(define factorial
  (lambda (n)
  (if (= n 0) 1
  (* n (factorial (- n 1))))))



In this example, using recursion we're reducing the problem to a simpler one by recursively calculating the factorial of n - 1. For the case where n equals to 0, we have a base case condition where the problem cannot be simplified further and the recursion stops. This is the same as the case of an empty list in the first example we saw while calculating the sum of a list of numbers.

Since Scheme and other purely functional languages don't give us classical iterative approaches like looping, the most natural way to solve such classes of problems boils down to recursion, where a problem is simplified into smaller pieces and a simple operation like addition or multiplication (the above two examples respectively) and a base case is identified. This base case then has a trivial solution which allows us to build a solution to the problem at hand bottom-up.

For further reference on recursion in Scheme, How to Design Programs by Felleisen et al and Concrete Abstractions: An introduction to computer science using Scheme by Hailperin et al are excellent books.

Written by Rae

Did you like this article? There are hundreds more.

Comments:
Anonymous
2011-06-07 16:48:31
You forgot to mention that even if a procedure is recursive, its generated process might be iterative (tail calls).
Anonymously add a comment: (or register here)
(registration is really fast and we send you no spam)
BB Code is enabled.
Captcha Number:



     
Your Ad Here
 
Copyright Open Source Institute, 2006