递归专项练习(笔试练习)3 ack函数

不知道大家有没有和小陈一样的想法,明明理解了递归的算法,可是当面对一道用递归来完成的题目时,却往往难以下手,这是我们的修为不够导致的,那么今天,小陈就由浅入深地为您详解一道递归小题,希望能帮到您!

 对于递归,我觉得很重要的第一个事就是,这个函数的功能是什么,而这个,是完全由你自己来定义的。 所谓递归,就是会在函数内部代码中,调用这个函数本身,那么就引出了第二件重要的事情,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,


 使用递归计算函数Ack(m,n),公式如下:

 

函数接口

  函数名:Ack   参 数:整型变量 m,n   返回值:整型 Ack 的值

输入

  输入 2 个整数 m,n 。

输出

  输出Ack的计算结果,格式为 "Ack(m,n)=X" 。

测试说明

测试用例

  输入:    3 4   输出:    Ack(3,4) = 125

 

主函数部分如下。

#include<stdio.h>
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    ack(m,n);
    printf("Ack(%d,%d) = %d",m,n,ack(m,n));
    return 0;
}

接下来要做的是用递归补全ack函数。

ack函数除了m=0时一直在不断调用自身,函数的出口,也就是递归调用的尽头,我们发现,只有当m=0时函数内没有调用ack函数,所以我们可以直接将它作为出口。

int ack(int m,int n)
{
int k;
if(m==0)
{
    k=n+1;
}
else if(n==0&&m>0)
{
    k=ack(m-1,1);
}
else{
    k=ack(m-1,ack(m,n-1));
}
return k;
}

分情况列出之后将k值返回即可。

希望能为大家带来帮助!

最后,如果您觉得我的文章写的不错。

请给小陈:

点赞,收藏加关注!我一定会带来更好的文章的!


 

 

好的,以下是一些 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++ 中的递归函数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈大大陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值