1、递归预防栈溢出、不能陷入死递归无法自拔、递归层次不能太深
2、递归要有跳出条件、每次递归必须逼近跳出条件
问:给一个数1234,分别按顺序输出1 2 3 4
#include<bits/stdc++.h>
using namespace std;
int strl(int n)
{
int cout;
if(n==0)
return 1;
while(n%10)
{
cout++;
n/=10;
}
return cout;
}
int mi(int x)
{
int re=1;
for(int i=1;i<x;i++)
{
re*=10;
}
return re;
}
void digui(int n)
{
int l=strl(n);
printf("%d ",n/mi(l));
if(n/10==0)
return ;
n=n-(n/mi(l))*mi(l);
digui(n);
}
int main()
{
digui(1234);
return 0;
}
初版代码:
写了两个函数strl(取位数)mi(取10的幂)在递归函数里调用,脑子抽了,好麻烦啊!!比存数组还麻烦
其实在打印前递归就很好的解决了这个问题
#include<bits/stdc++.h>
using namespace std;
void digui(int n)
{
if(n==0)return ;
digui(n/10);
printf("%d ",n%10);
}
int main()
{
digui(1234);
return 0;
}
这种情况下是1 2 3 4
void digui(int n)
{
if(n==0)return ;
printf("%d ",n%10);
digui(n/10);
}
这样就是4 3 2 1
用递归写strlen()
int my_strlen(char *str)
{
if(*str!='\0')
return 1+my_strlen(str+1);
return 0;
}
斐波那契:
int Fib(int n)
{
if(n<=2)
return 1;
return Fib(n-1)+Fib(n-2);
}
这样效率低
可以用迭代
int Fib(int n)
{
int a=1,b=1,c=1;
while(n>2)
{
c=a+b;
a=b;
b=c;
n--;
}
return c;
}
阶乘:
int Fac(int n)
{
if(n<=1)
return 1;
return n*Fac(n-1);
}
汉诺塔:
#include<bits/stdc++.h>
using namespace std;
void move(char beg,char end)
{
cout<<beg<<"->"<<end<<endl;
}
void hanoi(int n, char a, char b, char c)
{
if(n==1)
{
move(a,c);
return ;
}
else//else内所描述的就是两个圆盘应该怎么移动
{
hanoi(n-1,a,c,b); //a上盘移到b上
move(a,c);
hanoi(n-1,b,a,c); //b上盘移到c上
}
}
int main()
{
int n;
cin>>n;
hanoi(n,'A','B','C');
return 0;
}