Fibonacci number (C/C ++, Scheme)
I. background
Fibonacci number definition:
F0 = 0
F1 = 1
Fi = fi −1 + fi −2 (I> 1)
Ii. Analysis
I reference two tables. You can see them at a glance.
1. Recursion
(factorial 6)(* 6 (factorial 5))(* 6 (* 5 (factorial 4)))(* 6 (* 5 (* 4 (factorial 3))))(* 6 (* 5 (* 4 (* 3 (factorial 2)))))(* 6 (* 5 (* 4 (* 3 (2 (factorial 1))))))(* 6 (* 5 (* 4 (* 3 (* 2 1)))))(* 6 (* 5 (* 4 (* 3 2))))(* 6 (* 5 (* 4 6)))(* 6 (* 5 24))(* 6 120)720
2. Iteration
(factorial 6)(factorial 1 1 6)(factorial 1 2 6)(factorial 2 3 6)(factorial 6 4 6)(factorial 24 5 6)(factorial 120 6 6)(factorial 720 7 6)720
The core of recursion is: Constantly returning to the starting point.
The core of iteration is to constantly update parameters.
In the following code, the core of recursion is the sum operation. sum is constantly multiplied. Although the values are different, the form and meaning are the same.
The core of iteration is the constant updating of product and counter. In the preceding table, product is the first parameter of factorial, and the second parameter is counter, which is constantly updated by adding 1.
Product <-counter * product
Counter <-counter + 1
Iii. Code
C Language
#include
#include
int factorialRecursive(int n);int factorialIteration(int product, int counter, int max_count);int main(){ int n; printf(Enter an integer: ); scanf(%d,&n); printf(%d,factorialRecursive(n)); printf(%d,factorialIteration(1,1,n)); return 0;}int factorialRecursive(int n){ int sum=1; if(n==1) sum*=1; else sum=n*factorialRecursive(n-1); return sum;}int factorialIteration(int product, int counter, int max_count){ int sum=1; if(counter>max_count) sum*=product; else factorialIteration((counter*product),(counter+1),max_count);}
C ++
#include
using namespace std;int factorialRecursive(int n);int factorialIteration(int product, int counter, int max_count);int main(){ int n; cout<
>n; cout<
max_count) sum*=product; else factorialIteration((counter*product),(counter+1),max_count);}
Iv. Advanced
Scheme language edition
(define (factorial n) (if (= n 1) 1 (* n (factorial (- n 1)))))
(define (factorial n) (fact-iter 1 1 n))(define (fact-iter product counter max-count) (if (> counter max-count) product (fact-iter (* counter product) (+ counter 1) max-counter)))