{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## CS 201: Collatz\n", "\n", "

\n", "\n", " \n", "See collatz.rkt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Collatz Function" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "(define (collatz n)\n", " (if (= (modulo n 2) 0) (/ n 2)\n", " (+ 1 (* n 3))))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try it out." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "34" ], "text/plain": [ "34" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(collatz 11)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "17" ], "text/plain": [ "17" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(collatz 34)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "52" ], "text/plain": [ "52" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(collatz 17)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Recursion\n", "\n", "We can have collatz call its own result.\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "52" ], "text/plain": [ "52" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(collatz (collatz (collatz 11)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Having a function call itself is known as recursion. We can generate the series based on Collatz using recursion.\n", "\n", "The function c-series calls itself until the result converges to 1. The function uses let to introduce a local variable next" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "(define (c-series n)\n", " (print n)\n", " (newline)\n", " (if (equal? n 1) 'done\n", " (let ((next (collatz n)))\n", " (c-series next))))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11\n", "34\n", "17\n", "52\n", "26\n", "13\n", "40\n", "20\n", "10\n", "5\n", "16\n", "8\n", "4\n", "2\n", "1\n" ] }, { "data": { "text/html": [ "'done" ], "text/plain": [ "'done" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(c-series 11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can generate the series based on Collatz using recursion as above, but without the \n", "temporary variable next" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "(define (c-series2 n)\n", " (print n)\n", " (newline)\n", " (if (equal? n 1) 'done\n", " (c-series2 (collatz n))))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11\n", "34\n", "17\n", "52\n", "26\n", "13\n", "40\n", "20\n", "10\n", "5\n", "16\n", "8\n", "4\n", "2\n", "1\n" ] }, { "data": { "text/html": [ "'done" ], "text/plain": [ "'done" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(c-series2 11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Trace\n", "\n", "We can trace the execution of the recursive functions using the trace function, which prints out each call to the given function.\n", "\n", "When writing recursive code, you will often find it useful to use trace to see what is going on underneath the hood." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "(require racket/trace)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "(trace c-series)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ">(c-series 11)\n", "11\n", ">(c-series 34)\n", "34\n", ">(c-series 17)\n", "17\n", ">(c-series 52)\n", "52\n", ">(c-series 26)\n", "26\n", ">(c-series 13)\n", "13\n", ">(c-series 40)\n", "40\n", ">(c-series 20)\n", "20\n", ">(c-series 10)\n", "10\n", ">(c-series 5)\n", "5\n", ">(c-series 16)\n", "16\n", ">(c-series 8)\n", "8\n", ">(c-series 4)\n", "4\n", ">(c-series 2)\n", "2\n", ">(c-series 1)\n", "1\n", "<'done\n" ] }, { "data": { "text/html": [ "'done" ], "text/plain": [ "'done" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(c-series 11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define a c-series3 which does not print out results." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "(define (c-series3 n)\n", " (if (equal? n 1) 'done\n", " (c-series3 (collatz n))))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "'done" ], "text/plain": [ "'done" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(c-series3 11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not really too useful, unless we trace it." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "(trace c-series3)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ">(c-series3 11)\n", ">(c-series3 34)\n", ">(c-series3 17)\n", ">(c-series3 52)\n", ">(c-series3 26)\n", ">(c-series3 13)\n", ">(c-series3 40)\n", ">(c-series3 20)\n", ">(c-series3 10)\n", ">(c-series3 5)\n", ">(c-series3 16)\n", ">(c-series3 8)\n", ">(c-series3 4)\n", ">(c-series3 2)\n", ">(c-series3 1)\n", "<'done\n" ] }, { "data": { "text/html": [ "'done" ], "text/plain": [ "'done" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(c-series3 11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "End of Collatz notebook." ] } ], "metadata": { "kernelspec": { "display_name": "Racket", "language": "racket", "name": "racket" }, "language_info": { "codemirror_mode": "scheme", "file_extension": ".rkt", "mimetype": "text/x-racket", "name": "Racket", "pygments_lexer": "racket", "version": "7.4" } }, "nbformat": 4, "nbformat_minor": 4 }