第十九篇 -- 研究下函数(二) —— 递归函数

如果一个函数在其定义中又调用自身,则称为递归函数,调用自身的过程叫做递归。递归分为直接递归和间接递归。直接递归是指函数直接调用自身,间接递归则指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!\n"; 
    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)进行递归求解。

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

posted @ 2019-08-12 17:14  o云淡风轻o  阅读(215)  评论(0编辑  收藏  举报