递归

递归函数
递归函数执行的过程可以分为两步:
第一步,不断调用自己,直到函数的返回值不再是函数调用而是一个实际的数值;(递)
第二步,将每一层调用的结果一次返回给上一层,直到将最终结果返回给主函数;(归)
对于一个正常的递归函数来说,递的过程和归的过程都是必须的,因此在编写递归函数前一
定要确定好函数的结束条件,只递不归的函数会导致程序崩溃。

咱们先小试牛刀:

进制转换

【题目描述】
学习 C++语言进制中遇到了一些困难,现在要求输入一个八进制整数,然后输出这个
整数的十进制形式,请你编写代码帮他解决这个问题。
【输入描述】
一行,仅含一个八进制表示的正整数 a,a 的十进制表示的范围是(0,65536)。
【输出描述】
一行,a 的十进制表示。
【样例输入】
11
【样例输出】
9

我相信这题大家不用递归都会写,但用了递归就不一定会了!

先来说下不用递归的方法:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int main(){
 5     int a,sum=0,i=0;
 6     cin>>a;
 7     while(a!=0){
 8         int t=a%10;
 9         a/=10;
10         t=t*pow(8,i);
11         i++;
12         sum+=t;
13     }
14     cout<<sum;
15     return 0;
16 }

下面是递归代码:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int jz(int x,int i){
 5     if(x==0) return 0;
 6     return x%10*pow(8,i)+jz(x/10,++i);
 7 }
 8 int main(){
 9     int a,sum=0,i=0;
10     cin>>a;
11     cout<<jz(a,i);
12     return 0;
13 }

当然,递归也可以记忆化搜索:

递归的记忆化
递归的记忆化是指把计算结果保存下来
步骤:
1)用一个数组来保存计算的结果
2)如果计算过直接返回结果
3)如果没有计算过,则把计算结果保存到数组中,返回计算结果

斐波那契数列
【题目描述】
输入 n,1<=n<=1000,输出斐波那契数列第 n 项模 9997 的值。
【输入描述】
输入 n
【输出描述】
输出斐波那契数列第 n 项模 9997 的值
【样例输入】
10
【样例输出】
55

#include<iostream>
using namespace std;
int a[1005];
int f(int n){
      if(n<=2){
       a[n]=1;
        return 1;
       }
        if(a[n]!=0) return a[n];
        else{
            a[n]=f(n-1)+f(n-2);
            a[n]%=9997;
             return a[n];
        }
}
int main(){
     int n;
     cin>>n;
     cout<<f(n);
}

博客结束!

更多递归题目:

1163:阿克曼(Ackmann)函数

https://www.cnblogs.com/haoningdeboke-2022/p/16257497.html

posted @ 2022-07-26 20:12  傲来国国王  阅读(135)  评论(0编辑  收藏  举报