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

  • 相关阅读:
    ubuntu下使用ppa安装codeblocks集成开发环境
    CentOS g++ 安装
    CentOS 7.1云服务器 配置FTP服务器vsftpd
    div高度自适应浏览器高度
    HTML中的head结构
    javascript高级进阶系列
    javascript集中跨域方法
    canvas标签的width和height以及style.width和style.height的区别
    html5学习笔记之入新特性
    ie下a标签里的图片会有边框
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4483260.html
Copyright © 2011-2022 走看看