/* Leonardo numbers (Rosetta code) in Picat. http://rosettacode.org/wiki/Leonardo_numbers """ Leonardo numbers are also known as the Leonardo series. The Leonardo numbers are a sequence of numbers defined by: L(0) = 1 [1st equation] L(1) = 1 [2nd equation] L(n) = L(n-1) + L(n-2) + 1 [3rd equation] ─── also ─── L(n) = 2 * Fib(n+1) - 1 [4th equation] where the + 1 will herein be known as the add number. where the FIB is the Fibonacci numbers. This task will be using the 3rd equation (above) to calculate the Leonardo numbers. Edsger W. Dijkstra used Leonardo numbers as an integral part of his smoothsort algorithm. The first few Leonardo numbers are: 1 1 3 5 9 15 25 41 67 109 177 287 465 753 1219 1973 3193 5167 8361 ··· Task - show the 1st 25 Leonardo numbers, starting at L(0). - allow the first two Leonardo numbers to be specified [for L(0) and L(1)]. - allow the add number to be specified (1 is the default). - show the 1st 25 Leonardo numbers, specifying 0 and 1 for L(0) and L(1), and 0 for the add number. (The last task requirement will produce the Fibonacci numbers.) Show all output here on this page. """ This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go => println([leonardo(I) : I in 0..24]), println([leonardo(0,1,0,I) : I in 0..24]). leonardo(N) = leonardo(1,1,1,N). table leonardo(I1,_I2,_Add,0) = I1. leonardo(_I1,I2,_Add,1) = I2. leonardo(I1,I2,Add,N) = leonardo(I1,I2,Add,N-1) + leonardo(I1,I2,Add,N-2) + Add.