Commit 93df7adadfc357e54646b8ee000c51e9ae1b5e72

Authored by Georg Hopp
1 parent 38ae5d62

Add recursion example

... ... @@ -68,7 +68,7 @@ fn sqrt() {
68 68 let f = Fractional(-9, 4);
69 69 let fr :f64 = f.try_into().unwrap();
70 70 let sq = f.sqrt();
71   - let _sq = f64::sqrt(fr);
  71 + let _sq = fr.sqrt();
72 72
73 73 println!("{:>14} : {:?} / {}", format!("sqrt {}", f), sq, _sq);
74 74
... ... @@ -79,7 +79,7 @@ fn sqrt() {
79 79 let fr :f64 = (*f).try_into().unwrap();
80 80 let sq = f.sqrt().unwrap();
81 81 let sqr :f64 = sq.try_into().unwrap();
82   - let _sqr = f64::sqrt(fr);
  82 + let _sqr = fr.sqrt();
83 83
84 84 println!("{:>14} : {} {} / {}", format!("sqrt {}", f), sq, sqr, _sqr);
85 85 }
... ...
  1 +[package]
  2 +name = "recursion"
  3 +version = "0.1.0"
  4 +authors = ["Georg Hopp <georg@steffers.org>"]
  5 +edition = "2018"
  6 +
  7 +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
  8 +
  9 +[dependencies]
... ...
  1 +//
  2 +// Try some recursion with pattern matching... especially in
  3 +// conjunction with match to get a similar behavious as in e.g.
  4 +// haskell...
  5 +//
  6 +// Georg Hopp <georg@steffers.org>
  7 +//
  8 +// Copyright © 2019 Georg Hopp
  9 +//
  10 +// This program is free software: you can redistribute it and/or modify
  11 +// it under the terms of the GNU General Public License as published by
  12 +// the Free Software Foundation, either version 3 of the License, or
  13 +// (at your option) any later version.
  14 +//
  15 +// This program is distributed in the hope that it will be useful,
  16 +// but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18 +// GNU General Public License for more details.
  19 +//
  20 +// You should have received a copy of the GNU General Public License
  21 +// along with this program. If not, see <http://www.gnu.org/licenses/>.
  22 +//
  23 +
  24 +// Borrowing rules do not apply here because everything lives on the stack.
  25 +fn faculty(x: u32) -> u32 {
  26 + match x {
  27 + 0 => 1,
  28 + _ => x * faculty(x - 1),
  29 + }
  30 +}
  31 +
  32 +// for a tail recursive version we need to pass the currently calculated
  33 +// faculty to an inner tail recursive function.
  34 +// This will probably be optimized better, because the compiler would be
  35 +// able to unroll the complete recursion.
  36 +fn tail_faculty(x: u32) -> u32 {
  37 + fn faculty(x: u32, f: u32) -> u32 {
  38 + match x {
  39 + 0 => f,
  40 + _ => faculty(x - 1, x * f),
  41 + }
  42 + };
  43 + faculty(x, 1)
  44 +}
  45 +
  46 +fn main() {
  47 + for i in 0..10 {
  48 + println!("Fakultät {} = {}", i, faculty(i));
  49 + println!("tail recursive Fakultät {} = {}", i, tail_faculty(i));
  50 + }
  51 +}
... ...
Please register or login to post a comment