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)进行递归求解。

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

  • 相关阅读:
    数据结构与算法之PHP实现二叉树的遍历
    数据结构与算法之二叉树的基本概念和类型
    JS实现下拉单的二级联动
    数据结构与算法之PHP实现队列、栈
    数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
    数据结构与算法之数组、链表、队列、栈
    大型网站架构总结
    MySQL分库分表
    C基础 那些年用过的奇巧淫技
    C高级 服务器内核分析和构建 (一)
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/11341318.html
Copyright © 2011-2022 走看看