zoukankan      html  css  js  c++  java
  • 第十九篇 -- 研究下函数(二) —— 递归函数

    如果一个函数在其定义中又调用自身,则称为递归函数,调用自身的过程叫做递归。递归分为直接递归和间接递归。直接递归是指函数直接调用自身,间接递归则指A函数调用了B函数,而B函数又调用了A函数。函数递归应当有个终止条件,即当某个条件满足时,递归就应当停止。否则没完没了地继续下去,程序就会陷入死循环。

    有些问题本身就是用递归定义的,适合用递归函数来解决。典型的问题如Fibonacci数列:

    1, 1, 2, 3, 5, 8, 13, 21, ...

    在这个数列中,第1和第2个数都是1。其后的每一个数,都是这个数前面两个数的和,例如,第3个数2 = 1 + 1,第4个数3 = 1 + 2,第8个数21 = 8 + 13.

    如果要求第n个数,则首先应当求出第n-2和第n-1个数。为了求第n-2和第n-1个数,又需要求第n-4和第n-3个数。。。如此类推下去,直至第1和第2个数,而这两个数是已知的,递归到此终止。递归终止以后,就开始“反递归”,即根据递归终止时求得的值,一步步返回去,求得目标值。

    说明:程序员编程时只要编写递归过程,反递归过程则由编译器负责完成。

    // Fibonacci_study.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    
    #include "pch.h"
    #include <iostream>
    using namespace std;
    
    int Fibonacci(int n);
    
    int main()
    {
        cout << "Fibonacci数列中的第n个数: " << endl;
        int n = 0;        //变量n
        cout << "请输入n:";
        cin >> n;
        while (0 < n) {
            cout << "F(" << n << ") == " << Fibonacci(n) << endl << endl;
            cout << "请输入n:";
            cin >> n;
        }
        cout << "Hello World!
    "; 
        return 0;
    }
    
    int Fibonacci(int n) {
        if (1 == n || 2 == n) {
            return 1;
        }
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
    View Code

    在Fibonacci函数的定义中,“1==n||2==n”就是递归终止条件。如果这个条件不满足,则按照Fibonacci的定义F(n) = F(n-1) + F(n-2)进行递归求解。

    当心:虽然递归在解决某些问题方面非常方便,但也是有代价的。每次递归调用都要重新创建一份函数的副本。如果函数中有大量的变量,并且递归层次很多,则内存很快就会被消耗殆尽。因此,应用递归时,函数应当尽量简单,而且要尽量减少递归的层次。

  • 相关阅读:
    kettle结合MySQL生成保留最近6个月月度报告_20161009
    reduce用法
    【npm下载依赖包失败】gyp ERR! stack Error: EACCES: permission denied, mkdir问题解决方案
    【前端算法3】插入排序
    【前端算法2】快速排序
    【前端算法1】二分查找
    diy 滚动条 样式 ---- 核心代码
    [数据结构] 栈
    [数据结构] 列表
    day02 Python 运算符
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/11341318.html
Copyright © 2011-2022 走看看