Skip to content

Instantly share code, notes, and snippets.

@jargnar
Last active October 7, 2018 08:39
Show Gist options
  • Save jargnar/2caaa695fc216048d616d73c71d96a08 to your computer and use it in GitHub Desktop.
Save jargnar/2caaa695fc216048d616d73c71d96a08 to your computer and use it in GitHub Desktop.
Square-rooting in Racket
#lang racket
(define (mysqrt x)
;; a procedure to calculate square root of a number
;; starts with a guess and improves it until it is good enough
;; a guess can be improved by averaging itself with x/guess
(define (avg a b) (/ (+ a b) 2.0))
(define (improve-guess guess x) (avg guess (/ x guess)))
;; a guess is good enough when guess^2 tends to x
(define (good-enough? guess x) (< (abs (- (* guess guess) x)) 0.0001))
;; try and improve the guess until it is good enough
(define (try-guess guess x)
(if (good-enough? guess x) guess
(try-guess (improve-guess guess x) x)))
;; start with guess = 1
(try-guess 1.0 x))
@jargnar
Copy link
Author

jargnar commented Oct 7, 2018

Hmm.

#!/usr/bin/env python3

def avg(a, b):
    return (a + b) / 2.0

def improve_guess(guess, x):
    return avg(guess, x / guess)

def is_good_enough(guess, x):
    return abs(x - (guess * guess)) < 0.0001

def try_guess(guess, x):
    return guess if is_good_enough(guess, x) else try_guess(improve_guess(guess, x), x)
>>> try_guess(1.0, 26)
5.099019513684702

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment