zoukankan      html  css  js  c++  java
  • 斐波那契数(C/C++,Scheme)

    一、背景

    斐波那契数的定义:

    f0=0

    f1=1

    fi=fi1+fi2(i>1)

    二、分析

    我引用两张表,大家一看便懂。

    1.递归

    (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.迭代

    (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

    递归的核心在于:不断地回到起点。
    迭代的核心在于:不断地更新参数。

    在下面的代码中即将变量中,递归的核心是sum的运算,sum不断的累乘,虽然运算的数值不同,但形式和意义一样。

    而迭代的核心是product和counter的不断更新。如上表中,product就是factorial的前2个参数不断的累乘更新成第一个参数;而第二个参数则是counter,其不断的加1来更新自己。

    product <- counter * product
    counter < - counter + 1

    三、代码

    C语言版

    #include <stdio.h>
    #include <stdlib.h>
    
    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 <iostream>
    
    using namespace std;
    
    int factorialRecursive(int n);
    int factorialIteration(int product, int counter, int max_count);
    
    int main()
    {
        int n;
        cout<<"Enter an integer:"<<endl;
        cin>>n;
        cout<<factorialRecursive(n)<<endl;
        cout<<factorialIteration(1,1,n)<<endl;
    
        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);
    }

    四、进阶

    Scheme语言版

    (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)))



    为使本文得到斧正和提问,转载请注明出处:
    http://blog.csdn.net/nomasp

  • 相关阅读:
    PAT (Advanced Level) 1010. Radix (25)
    PAT (Advanced Level) 1009. Product of Polynomials (25)
    PAT (Advanced Level) 1008. Elevator (20)
    PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
    PAT (Advanced Level) 1006. Sign In and Sign Out (25)
    PAT (Advanced Level) 1005. Spell It Right (20)
    PAT (Advanced Level) 1004. Counting Leaves (30)
    PAT (Advanced Level) 1001. A+B Format (20)
    PAT (Advanced Level) 1002. A+B for Polynomials (25)
    PAT (Advanced Level) 1003. Emergency (25)
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4483260.html
Copyright © 2011-2022 走看看