More on FunctionsCS-2301 B-term 20081 More on Functions CS-2301, System Programming for Non-majors (Slides include materials from The C Programming Language,

Slides:



Advertisements
Similar presentations
Procedures in more detail. CMPE12cGabriel Hugh Elkaim 2 Why use procedures? –Code reuse –More readable code –Less code Microprocessors (and assembly languages)
Advertisements

CPS3340 COMPUTER ARCHITECTURE Fall Semester, /17/2013 Lecture 12: Procedures Instructor: Ashraf Yaseen DEPARTMENT OF MATH & COMPUTER SCIENCE CENTRAL.
Apr. 12, 2000Systems Architecture I1 Systems Architecture I (CS ) Lecture 6: Branching and Procedures in MIPS* Jeremy R. Johnson Wed. Apr. 12, 2000.
The University of Adelaide, School of Computer Science
Chapter 8 Runtime Support. How program structures are implemented in a computer memory? The evolution of programming language design has led to the creation.
Introduction to Operating Systems CS-2301 B-term Introduction to Operating Systems CS-2301, System Programming for Non-majors (Slides include materials.
Arrays in CCS-2301, B-Term Arrays in C (including a brief introduction to pointers) CS-2301, System Programming for Non-Majors (Slides include materials.
Stacks and HeapsCS-3013 A-term A Short Digression on Stacks and Heaps CS-3013 Operating Systems A-term 2008 (Slides include materials from Modern.
1 Storage Registers vs. memory Access to registers is much faster than access to memory Goal: store as much data as possible in registers Limitations/considerations:
Procedures in more detail. CMPE12cCyrus Bazeghi 2 Procedures Why use procedures? Reuse of code More readable Less code Microprocessors (and assembly languages)
Digression on Stack and Heaps CS-502 (EMC) Fall A Short Digression on Stacks and Heaps CS-502, Operating Systems Fall 2009 (EMC) (Slides include.
CS 3013 & CS 502 Summer 2006 Digressions:– Producer-Consumer and Stacks 1 Two Digressions Stacks Producer-Consumer models.
1 Pertemuan 20 Run-Time Environment Matakuliah: T0174 / Teknik Kompilasi Tahun: 2005 Versi: 1/6.
More Miscellaneous Topics CS-2301 B-term More Miscellaneous Topics CS-2301, System Programming for Non-majors (Slides include materials from The.
Arrays in CCS-2301 B-term Arrays in C (with a brief Introduction to Pointers) CS-2301, System Programming for Non-majors (Slides include materials.
Run time vs. Compile time
Semantics of Calls and Returns
Process in Unix, Linux and Windows CS-3013 C-term Processes in Unix, Linux, and Windows CS-3013 Operating Systems (Slides include materials from.
Scope Rules and Storage Types CS-2303, C-Term Scope Rules and Storage Types CS-2303, System Programming Concepts (Slides include materials from The.
Run-time Environment and Program Organization
Miscellaneous topicsCS-2301 B-term Miscellaneous Topics CS-2301, System Programming for Non-majors (Slides include materials from The C Programming.
Digression: the “Stack” 1 CS502 Spring 2006 Digression: the “Stack” Imagine the following program:– int factorial(int n){ if (n
Recursion A recursive function is a function that calls itself either directly or indirectly through another function. The problems that can be solved.
Stacks and HeapsCS-502 Fall A Short Digression Stacks and Heaps CS-502, Operating Systems Fall 2007 (Slides include materials from Operating System.
Guide To UNIX Using Linux Third Edition
Recursion and Function Implementation CS-2301 D-term Recursion and Implementation of Functions CS-2301 System Programming C-term 2009 (Slides include.
Processes in Unix, Linux, and Windows CS-502 Fall Processes in Unix, Linux, and Windows CS502 Operating Systems (Slides include materials from Operating.
Stacks and Frames Demystified CSCI 3753 Operating Systems Spring 2005 Prof. Rick Han.
Recursion and Implementation of Functions
Chapter 7: Runtime Environment –Run time memory organization. We need to use memory to store: –code –static data (global variables) –dynamic data objects.
Process in Unix, Linux, and Windows CS-3013 A-term Processes in Unix, Linux, and Windows CS-3013 Operating Systems (Slides include materials from.
CS-2710 Dr. Mark L. Hornick 1 Defining and calling procedures (subroutines) in assembly And using the Stack.
Stacks & Recursion. Stack pushpop LIFO list - only top element is visible top.
Runtime Environments Compiler Construction Chapter 7.
Compiler Construction
Recursion Textbook chapter Recursive Function Call a recursive call is a function call in which the called function is the same as the one making.
Computer Science Department Data Structure & Algorithms Lecture 8 Recursion.
Review Introduction to Searching External and Internal Searching Types of Searching Linear or sequential search Binary Search Algorithms for Linear Search.
RUN-Time Organization Compiler phase— Before writing a code generator, we must decide how to marshal the resources of the target machine (instructions,
Arrays in CCIS 1057 Fall Arrays in C (with a brief Introduction to Pointers) CIS 1057 Computer Programming in C Fall 2013 (Slides include materials.
ECE 103 Engineering Programming Chapter 36 C Storage Classes Herbert G. Mayer, PSU CS Status 8/4/2014 Initial content copied verbatim from ECE 103 material.
Introduction to Operating Systems CS-2301 B-term Introduction to Operating Systems (continued) CS-2301, System Programming for Non-majors (Slides.
Lecture 10: Modular Programming (functions) B Burlingame 13 April 2015.
LECTURE 13 Names, Scopes, and Bindings: Memory Management Schemes.
RecursionCIS 1057 Fall Recursion CIS 1057 Computer Programming in C Fall 2013 (Many slides based on/borrowed from Professor Hugh C. Lauer. Slides.
1 CSC 143 Recursion [Reading: Chapter 17]. 2 Recursion  A recursive definition is one which is defined in terms of itself.  Example:  Sum of the first.
Code Generation Instruction Selection Higher level instruction -> Low level instruction Register Allocation Which register to assign to hold which items?
Lecture 3 Translation.
Storage Allocation Mechanisms
Lecture 7 Macro Review Stack Frames
Storage Classes There are three places in memory where data may be placed: In Data section declared with .data in assembly language in C - Static) On the.
Run-Time Environments Chapter 7
© Craig Zilles (adapted from slides by Howard Huang)
ENERGY 211 / CME 211 Lecture 25 November 17, 2008.
Chapter 5 Conclusion CIS 61.
CS-3013 Operating Systems C-term 2008
Processes in Unix, Linux, and Windows
Outline for this evening
Processes in Unix, Linux, and Windows
Fundamentals of Programming
The University of Adelaide, School of Computer Science
Recursion and Implementation of Functions
Scope Rules and Storage Types
UNIT V Run Time Environments.
CSC 143 Recursion.
Processes in Unix, Linux, and Windows
Where is all the knowledge we lost with information? T. S. Eliot
© Craig Zilles (adapted from slides by Howard Huang)
Topic 2b ISA Support for High-Level Languages
Presentation transcript:

More on FunctionsCS-2301 B-term More on Functions CS-2301, System Programming for Non-majors (Slides include materials from The C Programming Language, 2 nd ed., by Kernighan and Ritchie and from C: How to Program, 5 th ed., by Deitel and Deitel)

More on FunctionsCS-2301 B-term Data Storage in Memory Variables may be automatic or static Automatic variables may only be declared within functions and compound statements Storage allocated when function is entered Storage is released when function returns Arguments and result are (somewhat) like automatic variables Storage is allocated and initialized by caller of function Storage is released after function returns to caller.

More on FunctionsCS-2301 B-term Static variables may be declared within or outside of functions Storage allocated when program is initialized Storage is released when program exits Static variables outside of functions may be visible to linker Compiler sets aside storage for all static variables at compiler or link time Values retained across function calls Initialization must evaluate to compile-time constant Static Data

More on FunctionsCS-2301 B-term Static Variable Examples int j;//static, visible to linker & all functs static float f; // not visible to linker, visible to // to all functions in this program int fcn (float a, int b) { // nothing inside of {} is visible to linker int i = b;//automatic double g;//automatic static double h;//static, not visible to // linker; value retained from call to call body – may access j, f, a, b, i, g, h }//int fcn( … )

More on FunctionsCS-2301 B-term Static Variable Examples (continued) int j;//static, visible to linker & all functs static float f; // not visible to linker, visible to // to all functions in this program int fcn (float a, int b) { // nothing inside of {} is visible to linker int i = b;//automatic double g;//automatic static double h;//static, not visible to // linker; value retained from call to call body – may access j, f, a, b, i, g, h }//int fcn( … ) Declaration outside any function:– always static static storage class:– not visible to linker

More on FunctionsCS-2301 B-term Static Variable Examples (continued) int j;//static, visible to linker & all functs static float f; // not visible to linker, visible to // to all functions in this program int fcn (float a, int b) { // nothing inside of {} is visible to linker int i = b;//automatic double g;//automatic static double h;//static, not visible to // linker; value retained from call to call body – may access j, f, a, b, i, g, h }//int fcn( … ) Inside function:– default is automatic static storage class:– not visible to linker

More on FunctionsCS-2301 B-term Static Variable Examples (continued) int j;//static, visible to linker & all functs static float f; // not visible to linker, visible to // to all functions in this program int fcn (float a, int b) { // nothing inside of {} is visible to linker int i = b;//automatic double g;//automatic static double h;//static, not visible to // linker; value retained from call to call body – may access j, f, a, b, i, g, h }//int fcn( … ) Note: value of h is retained from one call to next

More on FunctionsCS-2301 B-term Extern Variables int j;//static, visible to linker & all functs static float f; // not visible to linker, visible to // to all functions in this program extern float p; // static, defined in another program int fcn (float a, int b) { // nothing inside of {} is visible to linker int i = b;//automatic double g;//automatic static double h;//static, not visible to // linker; value retained from call to call body – may access j, f, a, b, i, g, h, p }//int fcn( … ) extern storage class:– a static variable defined in another C program

More on FunctionsCS-2301 B-term Questions?

More on FunctionsCS-2301 B-term Automatic Variables Arguments & Results Allocated on The Stack Definition – The Stack –A last-in, first-out data structure provided by the operating system for each running program –For temporary storage of automatic variables, arguments, function results, and other stuff Used by all modern programming languages –Even assembly languages for modern processors –… but not Fortran or Cobol!

More on FunctionsCS-2301 B-term Automatic Variables Allocated when function or compound statement is entered Released when function or compound statement is exited Values not retained from execution to next

More on FunctionsCS-2301 B-term Arguments and Results Arguments are values calculated by caller of function Placed on The Stack by caller for use by function Function may assign new value to argument, but … …caller never looks at argument values again! Result is storage allocated by caller On The Stack Assigned by return statement of function For use by caller Arguments & result are removed by caller After function returns, after caller has absorbed return value

More on FunctionsCS-2301 B-term Typical Implementation of The Stack Linear region of memory Stack Pointer “growing” downward Each time some information is pushed onto The Stack, pointer moves downward Each time info is popped off of The Stack, pointer moves back upward

More on FunctionsCS-2301 B-term Typical Memory for Running Program (Windows & Linux) 0x xFFFFFFFF address space program code (text) static data heap (dynamically allocated) stack (dynamically allocated) PC SP

More on FunctionsCS-2301 B-term Typical Memory for Running Program (Windows & Linux) 0x xFFFFFFFF address space program code (text) static data heap (dynamically allocated) stack (dynamically allocated) PC SP Heap to be discussed later in course

More on FunctionsCS-2301 B-term How it works Imagine the following program:– int factorial(int n){ … /* body of factorial function */ … }// factorial Imagine also the caller:– int x = factorial(100); What does compiled code look like?

More on FunctionsCS-2301 B-term Compiled code: the caller int x = factorial(100); Put the value “100” somewhere that factorial function can find Put the current program counter somewhere so that factorial function can return to the right place in calling function Provide a place to put the result, so that calling function can find it

More on FunctionsCS-2301 B-term Compiled code: factorial function Save the caller’s registers somewhere Get the argument n from the agreed-upon place Set aside some memory for local variables and intermediate results Do whatever factorial was programmed to do Put the result where the caller can find it Restore the caller’s registers Transfer back to the program counter saved by the caller

More on FunctionsCS-2301 B-term Question: Where is “somewhere”? So that caller can provide as many arguments as needed (within reason)? So that called routine can decide at run-time how much temporary space is needed? So that called routine can call any other routine, potentially recursively? We will explain recursion shortly

More on FunctionsCS-2301 B-term Answer: The Stack Calling function Push return address, space for result, and arguments onto stack Jump to called function Called function Push registers and automatic storage space onto stack Do work of the routine, store result in space pushed above Pop registers and automatic storage off stack Jump to return address left by calling routine

More on FunctionsCS-2301 B-term Typical Address Space (Windows & Linux) 0x xFFFFFFFF Memory address space program code (text) static data heap (dynamically allocated) stack (dynamically allocated) PC SP

More on FunctionsCS-2301 B-term Note Through the magic of operating systems, each running program has its own memory –Complete with stack & everything else Called a process Windows, Linux, Unix, etc.

More on FunctionsCS-2301 B-term Note (continued) Not necessarily true in small, embedded systems Real-time & control systems Mobile phone & PDA Remote sensors, instrumentation, etc. Multiple running programs share a memory Each in own partition with own stack Barriers to prevent each from corrupting others

More on FunctionsCS-2301 B-term Shared Physical Memory OS Kernel stack Process 1 stack Process 2 0x x0000FFFF Physical memory stack Process 3

More on FunctionsCS-2301 B-term Questions?

More on FunctionsCS-2301 B-term Why a Stack? Engineering reason – Computer architectures without stacks are not “rich” enough to support demands of modern computing Multiple running programs at the same time Complex interactions among running programs Modern computer languages Mathematical reason – To support recursive programs Not often by ordinary programmers with ordinary skills Some problems are too hard to solve without it Most notably, the compiler!

More on FunctionsCS-2301 B-term Why a Stack? Engineering reason – Computer architectures without stacks are not “rich” enough to support demands of modern computing Multiple running programs at the same time Complex interactions among running programs Modern computer languages Mathematical reason – To support recursive programs Not often by ordinary programmers with ordinary skills Some problems are too hard to solve without it Most notably, the compiler!

More on FunctionsCS-2301 B-term Why a Stack? Engineering reason – Computer architectures without stacks are not “rich” enough to support demands of modern computing Multiple running programs at the same time Complex interactions among running programs Modern computer languages Mathematical reason – To support recursive programs Not often used by programmers with ordinary skills, but … Some problems are too hard to solve without recursion Most notably, the compiler!

More on FunctionsCS-2301 B-term Why a Stack? Engineering reason – Computer architectures without stacks are not “rich” enough to support demands of modern computing Multiple running programs at the same time Complex interactions among running programs Modern computer languages Mathematical reason – To support recursive programs Not often used by programmers with ordinary skills, but … Some problems are too hard to solve without it Also, advanced games and robotics with “intelligent” objects

More on FunctionsCS-2301 B-term Definition – Recursion When a function calls itself, directly or indirectly When a mathematical or programmatic concept is defined in terms of itself E.g., definition of compound statement in §A9.3, p.223

More on FunctionsCS-2301 B-term Definition – Recursion When a function calls itself, directly or indirectly When a mathematical or programmatic concept is defined in terms of itself E.g., definition of compound statement in §A9.3, p.223 In both cases, something is needed to break the circularity

More on FunctionsCS-2301 B-term Example – Towers of Hanoi Move stack of disks from one peg to another Move one disk at a time Larger disk may never be on top of smaller disk

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0) { move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move The function main – gets number of disks and invokes function move

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move The function move – where the action is

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move First move all but one of the disks to temporary peg

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move Next, move the remaining disk to the destination peg

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move Finally, move disks from temporary to destination peg

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move Notice that move calls itself twice, but with one fewer disks each time

More on FunctionsCS-2301 B-term Implementation on The Stack n SP Stack entry for main …

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move return address a = 1 c = 2 b = 3 disks = n-1 Args for 2 nd call to move

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move return address a = 1 c = 2 b = 3 disks = n-1 Args for 2 nd call to move Args for subsequent calls to move go here

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move return address a = 1 c = 2 b = 3 disks = n-1 Args for 2 nd call to move Eventually, disks = 0, so no more calls to move All existing calls return

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move Leaving stack like this again

More on FunctionsCS-2301 B-term Tower of Hanoi Program #include void move (int disks, int a, int c, int b); int main() { int n; printf ("How many disks?"); scanf ("%d", &n); printf ("\n"); move (n, 1, 3, 2); return 0; }// main /* PRE: n >= 0; a, b, and c represent some order of the distinct integers 1, 2, 3 POST: the function displays the individual moves necessary to move n disks from needle a to needle c, using needle b as a temporary storage needle */ void move (int disks, int a, int c, int b) { if (disks > 0){ move (disks-1, a, b, c); printf ("Move one disk from %d to %d\n", a, c); move (disks-1, b, c, a); }// if (disks > 0 return; }//move

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move move now moves one disk from peg1 to peg3, and then calls move again!

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move return address a = 3 c = 2 b = 1 disks = n-1 Args for call to move disks back from peg3 to peg2

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move return address a = 3 c = 2 b = 1 disks = n-1 Args for call to move back Args for subsequent calls to move back go here

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move return address a = 3 c = 2 b = 1 disks = n-1 Args for 2 nd call to move Eventually, disks = 0, so no more calls to move All existing calls return

More on FunctionsCS-2301 B-term Implementation on The Stack (continued) n SP Stack entry for main … return address a = 1 c = 3 b = 2 disks = n Args for call to move Leaving stack like this again, but with all disks moved to peg 3

More on FunctionsCS-2301 B-term Implementation on The Stack n SP Stack entry for main … move returns back to main

More on FunctionsCS-2301 B-term Fundamental Principle Stack provides a simple mechanism for implementing recursive functions Arbitrary numbers of intermediate functions Eventually, something must break the circularity of recursion Or stack will grow until it overflows memory!

More on FunctionsCS-2301 B-term Note on Recursive Functions Some simple recursive functions can be “unwound” into loops – e.g., int factorial(int n) { return (n <= 1) ? 1 : (n * factorial(n-1)); }//factorial is equivalent to int factorial(int n) { int product = 1; for (int k=1; k <= n; k++) product *= k; return product } //factorial

More on FunctionsCS-2301 B-term Note on Recursive Functions (continued) Other recursive functions are much too difficult to understand if unwound E.g., Tower of Hanoi Keeping track of which disk is on which peg requires superhuman intellect, very complex code!

More on FunctionsCS-2301 B-term Questions