递归
递归函数
递归函数执行的过程可以分为两步:
第一步,不断调用自己,直到函数的返回值不再是函数调用而是一个实际的数值;(递)
第二步,将每一层调用的结果一次返回给上一层,直到将最终结果返回给主函数;(归)
对于一个正常的递归函数来说,递的过程和归的过程都是必须的,因此在编写递归函数前一
定要确定好函数的结束条件,只递不归的函数会导致程序崩溃。
咱们先小试牛刀:
进制转换
【题目描述】
学习 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); }
博客结束!
更多递归题目: