<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Gunnar Peipman's ASP.NET blog : Algorithms</title><link>http://weblogs.asp.net/gunnarpeipman/archive/tags/Algorithms/default.aspx</link><description>Tags: Algorithms</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>.Net Framework 4.0: Introducing BigInteger</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2009/05/23/net-framework-4-0-introducing-biginteger.aspx</link><pubDate>Sat, 23 May 2009 08:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7095224</guid><dc:creator>DigiMortal</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=7095224</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2009/05/23/net-framework-4-0-introducing-biginteger.aspx#comments</comments><description>&lt;p&gt;My previous posting was about &lt;a href="http://weblogs.asp.net/gunnarpeipman/archive/2009/05/23/performance-of-fibonacci-numbers-algorithms.aspx" target="_blank"&gt;performance of Fibonacci numbers algorithms&lt;/a&gt;. In this posting I will introduce you some problems related to limits of our usual integers and introduce you new feature in .Net Framework 4.0 – big integers. Big integers are useful when solving different mathematical problems. Also they are used in cryptography.&lt;/p&gt;  &lt;p&gt;As a first thing let’s see the problem we may face when we use our usual integers. Let’s use faster implementation of Fibonacci numbers algorithm so we don’t have to wait a long time to get results we need.&lt;/p&gt; &lt;strong&gt;C#&lt;/strong&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 13px tahoma; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class="Apple-style-span"&gt;    &lt;hr size="1" /&gt;    &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;     &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; Fibonacci(&lt;span style="color: blue"&gt;int&lt;/span&gt; x)&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; previousValue = -1;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; currentResult = 1;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; i = 0; i &amp;lt;= x; ++i)&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; sum = currentResult + previousValue;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousValue = currentResult;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentResult = sum;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; currentResult;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
  &lt;/div&gt;

  &lt;div style="background-color: white; font-family: &amp;#39;courier new&amp;#39;; color: black; font-size: 10pt; -webkit-background-clip: initial; -webkit-background-origin: initial"&gt;
    &lt;hr size="1" /&gt;&lt;/div&gt;
&lt;/span&gt;

&lt;p&gt;&lt;strong&gt;VB.NET&lt;/strong&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 13px tahoma; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class="Apple-style-span"&gt; 
    &lt;br class="Apple-interchange-newline" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;hr size="1" /&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 10pt &amp;#39;Courier New&amp;#39;; white-space: nowrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,187); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Public&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;Fibonacci&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;ByVal&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt;&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;-&lt;/span&gt;1&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;1&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;For&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;i&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;0&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;To&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;sum&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;+&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;sum&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Next&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Return&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;End&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;/span&gt; 

&lt;hr size="1" /&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="float: right; margin-left: 10px"&gt;
  &lt;table border="1" cellspacing="0" cellpadding="2"&gt;&lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Input&lt;/th&gt;

        &lt;th&gt;Actual&lt;/th&gt;

        &lt;th&gt;Expected&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;&lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;40&lt;/td&gt;

        &lt;td align="right"&gt;102334155&lt;/td&gt;

        &lt;td align="right"&gt;102334155&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;41&lt;/td&gt;

        &lt;td align="right"&gt;165580141&lt;/td&gt;

        &lt;td align="right"&gt;165580141&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;42&lt;/td&gt;

        &lt;td align="right"&gt;267914296&lt;/td&gt;

        &lt;td align="right"&gt;267914296&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;43&lt;/td&gt;

        &lt;td align="right"&gt;433494437&lt;/td&gt;

        &lt;td align="right"&gt;433494437&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;44&lt;/td&gt;

        &lt;td align="right"&gt;701408733&lt;/td&gt;

        &lt;td align="right"&gt;701408733&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;45&lt;/td&gt;

        &lt;td align="right"&gt;1134903170&lt;/td&gt;

        &lt;td align="right"&gt;1134903170&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;46&lt;/td&gt;

        &lt;td align="right"&gt;1836311903&lt;/td&gt;

        &lt;td align="right"&gt;1836311903&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;47&lt;/td&gt;

        &lt;td align="right"&gt;-1323752223&lt;/td&gt;

        &lt;td align="right"&gt;2971215073&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;48&lt;/td&gt;

        &lt;td align="right"&gt;512559680&lt;/td&gt;

        &lt;td align="right"&gt;4807526976&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;49&lt;/td&gt;

        &lt;td align="right"&gt;-811192543&lt;/td&gt;

        &lt;td align="right"&gt;7778742049&lt;/td&gt;
      &lt;/tr&gt;

      &lt;tr&gt;
        &lt;td&gt;50&lt;/td&gt;

        &lt;td align="right"&gt;-298632863&lt;/td&gt;

        &lt;td align="right"&gt;12586269025&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;Now let’s take some value range where we can expect big numbers as result. Let’s take range from 40 to 50 and compare the results of our algorithm with expected results.&lt;/p&gt;

&lt;p&gt;We can see that starting from 47 our results are different. 47 is the point where we go over integer limits and then we go to “next round” in integer scope. Same thing happens also with unsigned integer, long and unsigned long.&lt;/p&gt;

&lt;p&gt;If we take some bigger input for our algorithm then we will get even larger numbers. 47 is small number and I am sure that scientific calculations use usually bigger inputs too and breaking over the limits of used type is almost sure. &lt;/p&gt;

&lt;p&gt;You may also consider some other algorith that produces faster growth of results. Perfect candidate for this is factorial algorithm. By example 40! = 815915283247897734345611269596115894272000000000.&lt;/p&gt;

&lt;h3&gt;Introducing BigInteger class&lt;/h3&gt;

&lt;p&gt;.Net Framework 4.0 solves our problem. New namespace &lt;a href="http://msdn.microsoft.com/en-us/library/system.numerics(VS.100).aspx" target="_blank"&gt;System.Numerics&lt;/a&gt; contains class called &lt;a href="http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(VS.100).aspx" target="_blank"&gt;BigInteger&lt;/a&gt;. You can use objects based on this class as usual integers. This class also provides static methods for different mathematical operations on big integers. Let’s move now to BigInteger class with our Fibonacci numbers algorithm.&lt;/p&gt;
&lt;strong&gt;C#&lt;/strong&gt; 

&lt;hr size="1" /&gt;

&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BigInteger&lt;/span&gt; Fibonacci(&lt;span style="color: blue"&gt;int&lt;/span&gt; x)&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; previousValue = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BigInteger&lt;/span&gt;(-1);&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; currentResult = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;BigInteger&lt;/span&gt;(1);&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; i = 0; i &amp;lt;= x; ++i)&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; sum = currentResult + previousValue;&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousValue = currentResult;&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentResult = sum;&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; currentResult;&lt;/pre&gt;

&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;

&lt;hr size="1" /&gt;

&lt;p&gt;&lt;strong&gt;VB.NET&lt;/strong&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 13px tahoma; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class="Apple-style-span"&gt; 
    &lt;br class="Apple-interchange-newline" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;hr size="1" /&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 10pt &amp;#39;Courier New&amp;#39;; white-space: nowrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,187); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class="Apple-style-span"&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Public&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;Fibonacci&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;ByVal&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt;&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;BigInteger 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;New&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;BigInteger&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;-&lt;/span&gt;1&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;New&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;BigInteger&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;1&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;For&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;i&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;0&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;To&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;sum&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;+&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;previousValue 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;sum 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Next&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Return&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult 

  &lt;br /&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;End&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function
    &lt;hr size="1" /&gt; &lt;/span&gt;&lt;/span&gt;

&lt;p&gt;When we run this code we get expected results.&lt;/p&gt;

&lt;h3&gt;Some words about BigInteger structure&lt;/h3&gt;

&lt;p&gt;BigInteger is structure by its nature. It has bunch of static methods that let you perform different mathematical operations on BigIntegers. There are also many operators and type conversions defined for BigInteger so you can use BigIntegers like usual integers. Take look at the &lt;a href="http://msdn.microsoft.com/en-us/library/system.numerics.biginteger_members(VS.100).aspx" target="_blank"&gt;BigInteger members documentation&lt;/a&gt;.&lt;/p&gt;

&lt;hr size="1" /&gt;
&lt;table cellpadding="0" cellspacing="2" width="100%" border="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f05%2f23%2fnet-framework-4-0-introducing-biginteger.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f05%2f23%2fnet-framework-4-0-introducing-biginteger.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/Net-Framework-40-Introducing-BigInteger"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F05%2F23%2Fnet-framework-4-0-introducing-biginteger.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://progg.ru/Net-Framework-40-%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC-BigInteger"&gt;&lt;img alt="Progg it" src="http://progg.ru/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F05%2F23%2Fnet-framework-4-0-introducing-biginteger.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/Net-Framework-40-Introducing-BigInteger-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F05%2F23%2Fnet-framework-4-0-introducing-biginteger.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7095224" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Algorithms/default.aspx">Algorithms</category></item><item><title>Performance of Fibonacci numbers algorithms</title><link>http://weblogs.asp.net/gunnarpeipman/archive/2009/05/23/performance-of-fibonacci-numbers-algorithms.aspx</link><pubDate>Sat, 23 May 2009 00:19:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7095044</guid><dc:creator>DigiMortal</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/gunnarpeipman/rsscomments.aspx?PostID=7095044</wfw:commentRss><comments>http://weblogs.asp.net/gunnarpeipman/archive/2009/05/23/performance-of-fibonacci-numbers-algorithms.aspx#comments</comments><description>&lt;p&gt;Performance of algorithms is important topic if you want to write programs that work fast and doesn’t eat too much resources. In this example I will show you two implementations of famous &lt;a href="http://en.wikipedia.org/wiki/Fibonacci_number" target="_blank"&gt;Fibonacci numbers&lt;/a&gt; algorithm and let you compare how these two implementations perform. This posting will be also introduction to my next posting to keep it smaller and to keep focus on point.&lt;/p&gt;  &lt;p&gt;You can read more about Fibonacci numbers from Data Structures and Algorithms with Object-Oriented Patterns in C#, chapter &lt;a href="http://www.brpreiss.com/books/opus6/html/page76.html" target="_blank"&gt;Example-Fibonacci Numbers&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Recursive implementation&lt;/h3&gt;  &lt;p&gt;Our first implementation of Fibonacci numbers uses recursive algorithm. Recursive algorithm is very short and also easy to read. &lt;/p&gt; &lt;strong&gt;C#&lt;/strong&gt;   &lt;hr size="1" /&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; FibonacciRecursive(&lt;span style="color: blue"&gt;int&lt;/span&gt; x)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (x == 0 || x == 1)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; x;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; FibonacciRecursive(x - 1) + &lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FibonacciRecursive(x - 2);&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;

  &lt;hr size="1" /&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;VB.NET&lt;/strong&gt; 

  &lt;hr size="1" /&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 10pt &amp;#39;Courier New&amp;#39;; white-space: nowrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,187); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class="Apple-style-span"&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Public&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;FibonacciRecursive&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;ByVal&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt;&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;If&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;0 OrElse x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;1&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Then&lt;/span&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Return&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x 

    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;End&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;If&lt;/span&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Return&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;FibonacciRecursive&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;-&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;1&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;+&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;FibonacciRecursive&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;-&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;2&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt; 

    &lt;br /&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;End&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;/span&gt; 

  &lt;hr size="1" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Experienced programmers should see here two dangers. First of them gets clear to others at the end of this posting. Second of them is simple: recursive code is harder to debug than flat code. &lt;/p&gt;

&lt;h3&gt;Flat implementation&lt;/h3&gt;

&lt;p&gt;The other implementation is not so short but it doesn’t call our algorithm again and again. It is also not so easy to read as first implementation.&lt;/p&gt;
&lt;strong&gt;C#&lt;/strong&gt; 

&lt;hr size="1" /&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; Fibonacci(&lt;span style="color: blue"&gt;int&lt;/span&gt; x)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; previousValue = -1;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; currentResult = 1;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;for&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; i = 0; i &amp;lt;= x; ++i)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; sum = currentResult + previousValue;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousValue = currentResult;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentResult = sum;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; currentResult;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;

  &lt;hr size="1" /&gt;&lt;/div&gt;

&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;&amp;#160;&lt;/div&gt;
&lt;strong&gt;VB.NET&lt;/strong&gt; 

&lt;hr size="1" /&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 10pt &amp;#39;Courier New&amp;#39;; white-space: nowrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,187); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0" class="Apple-style-span"&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Public&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;Fibonacci&lt;span style="color: rgb(0,0,0)" class="br0"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;ByVal&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt;&lt;span style="color: rgb(0,0,0)" class="br0"&gt;)&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;As&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,0,0)" class="kw4"&gt;Integer&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;-&lt;/span&gt;1 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;1 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;For&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;i&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;0&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;To&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;x 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Dim&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;sum&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;+&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;previousValue 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; previousValue&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult 

  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentResult&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)" class="sy0"&gt;=&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;sum 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Next&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt; 

  &lt;br /&gt;&amp;#160;&amp;#160; &lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(255,128,0)" class="kw2"&gt;Return&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;currentResult 

  &lt;br /&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;End&lt;/span&gt;&lt;span class="Apple-converted-space"&gt;&amp;#160;&lt;/span&gt;&lt;span style="color: rgb(6,0,255)" class="kw6"&gt;Function&lt;/span&gt;&lt;/span&gt; 

&lt;hr size="1" /&gt;

&lt;p&gt;Before I say anything else let’s compare performance of those implementations.&lt;/p&gt;

&lt;h3&gt;Performance&lt;/h3&gt;

&lt;p&gt;Now let’s see how these implementations perform. I am sure that less experienced programmers will check if these implementations give same results and they will try them with pretty small inputs. But… look at the results.&lt;/p&gt;

&lt;p align="center"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="" border="0" alt="" src="http://weblogs.asp.net/blogs/gunnarpeipman/fibonacciperformance_7848C07D.png" width="483" height="291" /&gt; 

  &lt;br /&gt;&lt;em&gt;Performance results of recursive and flat implementations of 
    &lt;br /&gt;Fibonacci numbers algorithm.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Horizontal axis shows input integers. Vertical axis shows us time in seconds that calculation took. For smaller inputs both implementations perform very well. Near 30 performance of recursive implementations starts going worse. For the time of last input (that is 41) we are sure that recursive implementation is a highway to hell. But performance of flat implementation is still okay.&lt;/p&gt;

&lt;p&gt;This example is good illustration why we must test all the implementations we have before making decision which implementation to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Bart Czernicki asked in his comment about F# performance when using recursive calls. I tried it out and F# performs very well in this scenario. In F# you can use recursive calls without any problems as my tests showed me.&lt;/p&gt;

&lt;hr size="1" /&gt;
&lt;table border="0" cellpadding="0" cellspacing="2" width="100%"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f05%2f23%2fperformance-of-fibonacci-numbers-algorithms.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fweblogs.asp.net%2fgunnarpeipman%2farchive%2f2009%2f05%2f23%2fperformance-of-fibonacci-numbers-algorithms.aspx" border="0" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;a rev="vote-for" href="http://pimpthisblog.com/Performance-of-Fibonacci-numbers-algorithms-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="pimp it" src="http://pimpthisblog.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F05%2F23%2Fperformance-of-fibonacci-numbers-algorithms.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td align="right"&gt;
&lt;a rev="vote-for" href="http://dotnetshoutout.com/Performance-of-Fibonacci-numbers-algorithms-Gunnar-Peipmans-ASPNET-blog"&gt;&lt;img alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fweblogs.asp.net%2Fgunnarpeipman%2Farchive%2F2009%2F05%2F23%2Fperformance-of-fibonacci-numbers-algorithms.aspx" style="border:0px"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7095044" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Performance/default.aspx">Performance</category><category domain="http://weblogs.asp.net/gunnarpeipman/archive/tags/Algorithms/default.aspx">Algorithms</category></item></channel></rss>