C++中的递归函数

1 定义

直接或间接调用自己的函数成为递归函数(recursionfunction)。在求解某些具有随意性的复杂问题时经常使用递归,例如求解阶乘或者两个数的最大公约数等。因为这时解的具体“大小”不受限制,函数可以一直递归调用,直到问题解决。

2 要求

递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽,这种“永远”递归下去的现象叫做“无限递归错误”(infiniterecursion error)。

3 实例

以下代码是名为removeHat()的函数。

void removeHat(char cat)

{

    for(charc='A'; c<cat; c++)

    {

       cout << " ";

    }

    if( cat<='Z' )

    {

       cout << "cat"<< cat << endl;

       removeHat(cat+1);

    }

    else

    {

       cout << "VOOM!!!"<< endl;

    }

}

该函数的作用是输入若干个空格以及型为“catA”、“catB”的字符串。其中

if(cat<=’Z’)是终止条件,当cat小于或等于’Z’时,函数递归调用;当cat大于’Z’时,函数终止,最后输入“VOOM!!!”。

当在main()函数中使用如下方式调用removeHat()时

removeHat('A');

输出的效果如图1所示。


图1 程序输出效果

4 实战

在CSDN论坛上有朋友使用递归来得到两个数的最大公约数,他的函数代码如下

int gcd(int x, int y)

{

    int tmp = x;

    if(tmp > 0)

    {

       if( x > y )

       {

           tmp = x % y;

           gcd(tmp, y);

       }

       else

       {

           tmp = y % x;

           gcd(tmp, x);

       }

    }

    return y;

}

其中,gcd()函数的终止条件是tmp>0。也就是说,如果tmp大于0,则递归调用gcd()函数;否则返回y值。使用该函数获得的最大公约数始终为用户输入两个数中的最后一个数,而无法得到正确的值。

从上面的代码分析,gcd()函数的递归终止条件应该没有问题,而递归调用的函数也没有问题。无法得到正确的最大公约数的问题就是处在递归调用gcd()函数时,虽然该函数被递归调用,但是函数的返回值始终是y,因此应该将以上代码修改为

int gcd(int x, int y)

{

    int tmp = x;

    if(tmp > 0)

    {

       if( x > y )

       {

           tmp = x % y;

           return gcd(tmp, y);

       }

       else

       {

           tmp = y % x;

           return gcd(tmp, x);

       }

    }

    return y;

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一些 C++ 递归函数练习题: 1. 编写一个递归函数,计算 n 的阶乘 ```cpp int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } ``` 2. 编写一个递归函数,计算斐波那契数列的第 n 项 ```cpp int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci(n - 2); } } ``` 3. 编写一个递归函数,计算一个数字的二进制表示 1 的个数 ```cpp int countOnes(int n) { if (n == 0) { return 0; } else { return (n % 2 == 1) + countOnes(n / 2); } } ``` 4. 编写一个递归函数,计算一个数字的反转 ```cpp int reverse(int n) { if (n < 10) { return n; } else { return (n % 10) * pow(10, floor(log10(n))) + reverse(n / 10); } } ``` 5. 编写一个递归函数,计算一个字符串的长度 ```cpp int stringLength(string str) { if (str == "") { return 0; } else { return 1 + stringLength(str.substr(1)); } } ``` 6. 编写一个递归函数,判断一个字符串是否是回文字符串 ```cpp bool isPalindrome(string str) { if (str.length() <= 1) { return true; } else if (str[0] != str[str.length() - 1]) { return false; } else { return isPalindrome(str.substr(1, str.length() - 2)); } } ``` 7. 编写一个递归函数,计算一个数组所有元素的和 ```cpp int arraySum(int arr[], int size) { if (size == 0) { return 0; } else { return arr[0] + arraySum(arr + 1, size - 1); } } ``` 8. 编写一个递归函数,计算一个数组所有元素的平均值 ```cpp double arrayAverage(int arr[], int size) { if (size == 0) { return 0; } else { return (arr[0] + (size - 1) * arrayAverage(arr + 1, size - 1)) / size; } } ``` 9. 编写一个递归函数,计算一个数组的最大值 ```cpp int arrayMax(int arr[], int size) { if (size == 1) { return arr[0]; } else { return max(arr[0], arrayMax(arr + 1, size - 1)); } } ``` 10. 编写一个递归函数,计算一个数组的最小值 ```cpp int arrayMin(int arr[], int size) { if (size == 1) { return arr[0]; } else { return min(arr[0], arrayMin(arr + 1, size - 1)); } } ``` 希望这些练习题能够帮助你练习 C++ 递归函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值