把一个大型的复杂问题,层层化为内容相似的规模较小的问题来求解,这就是递归的思路。
问题一:输入一个int型数,如:2022,输出2 0 2 2
很显然这里需要重复进行:t=n%10;n=n/10;printf("%d",t);不过需要第一个输出整数的最高位,刚好递归可以很方便的做到。
#include <stdio.h>
int main()
{
int numb;
void new_print(int n);
scanf("%d",&numb);
new_print(numb);
return 0;
}
void new_print(int n)
{
if(n>10)
{
print(n/10);
}
printf("%d ",n%10);
}
问题二: 不用创建参数,测试字符串的长度
int main()
{
char str1[]="struggle up!!!";
printf("%d\n",strlen(str1));
}
或者,用上函数的递归和指针,如下:
int my_strlen(char* str)
{
if(*str!='\0')
{
return 1+my_strlen(str+1);
}
}
int main()
{
char str1[]="struggle up!!!";
printf("%d\n",my_strlen(str1));
return 0;
}
问题三:输入一个数,求阶乘
int factorial(int n)
{
if(n>1)
return n*factorial(--n);
}
int main()
{
int n=0;
scanf("%d",&n);
printf("%d",factorial(n));
return 0;
}
问题四:斐波那契数,这到题要注意了,因为面试,笔试,很可能会出现,还有这个问题用递归存在的问题。
int count=0;
int fibonacci(int n)
{
int a=1;
int b=1;
if(3==n)
{
count++;
}
if(n<=2)
{
return 1;
}
else
return fibonacci(n-1)+fibonacci(n-2);
}
int main()
{
int n=0;
scanf("%d",&n);
printf("%d\n",fibonacci(n));
printf("%d\n",count);
return 0;
}
40
102334155
39088169
很显然,在这道题中,重复计算了39088169次fibonacci(3),这对资源是十分浪费的!!!
可以用循环来优化它。
int fibonacci(int n)
{
int a=1;
int b=1;
int c=1;
while(n>2)
{
c=a+b;
a=b;
b=c;
n--;
}
return c;
}
第五题:汉诺塔问题,这道题也很有可能会考
第六题:青蛙跳台问题,
这个问题和斐波那契数列差不多,先用数学把数列总结下来!
这里就不列举了
void hannuo(int n,char a,char b,char c)
{
if(n==1)
printf("\t%c->%c\n",a,c); //当n只有1个的时候直接从a移动到c
else
{
hannuo(n-1,a,c,b); //a的n-1个盘子通过c移动到b
printf("\t%c->%c\n",a,c); //a的最后1个盘(最大的盘)移动到c
hannuo(n-1,b,a,c); //b上面的n-1个盘通过a移动到c
}
}
int main()
{
int n=0;
scanf("%d",&n);
hannuo(n,'A','B','C');
return 0;
}
总的来所,递归问题是用来锻炼思维的,它十很可能造成栈溢出,学习了解就好。
下一篇文章,回来学习冒泡排序,和选择排序的优化问题