其实函数递归对于一些问题来说是真的很简单,但是很多问题还是不要用函数递归的好,比如斐波那契数列问题,因为数字太大之后,很难直接算出来,有些时候反而不用递归用迭代(循环)还好一些
下面是我依据自己的思路来写出来的代码,一共是四个题目,斐波那契数列、青蛙跳台阶(本质上也是斐波那契数列)、汉诺塔(递归)、n的k次方(递归实现)。
1.
//递归实现斐波那契数列
int fib(int n)
{
if (n < 3)
return 1;
else
return (fib(n - 2) + fib(n - 1));
}
int main()
{
int n = 0;
int sum = 0;
scanf("%d", &n);
sum = fib(n);
printf("%d", sum);
return 0;
}
//模拟实现斐波那契数列(非递归)
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
2.
//青蛙跳台阶问题:有一只青蛙跳n个台阶,一次可以跳1个或者跳两个,请问一共有多少种跳法
//本质上就是斐波那契数列问题
//1.递归
int Fib(int n)
{
if (n <= 1)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d", ret);
return 0;
}
//2.非递归
int Fib(int n)
{
int a = 1;
int b = 2;
int c = 1;
int i = 1;
while (n)
{
if (n <= 1)
return a;
else if (n == 2)
return b;
else
{
c = a + b;
a = b;
b = c;
}
n--;
}
return c;
}
int main()
{
int n = 0;
printf("请输入台阶数:");
scanf("%d", &n);
int ret = Fib(n);
printf("一共有:%d种方法", ret);
return 0;
}
3.
//汉诺塔问题:
int Han(int n)
{
if (n == 1)
return 1;
else
return 2 * Han(n - 1) + 1;
}
int main()
{
int n = 0;
printf("请输入盘子个数:");
scanf("%d", &n);
int ret=Han(n);
printf("一共要移动:%d次", ret);
}
4.
//n的k次方(递归实现)
int My_pow(int n, int k)
{
if (k == 0)
return 1;
else
return n * My_pow(n, k - 1);
}
int main()
{
int k = 0;
int n = 0;
scanf("%d %d", &n, &k);
int ret = My_pow(n, k);
printf("%d", ret);
return 0;
}
温馨提示:小白编程,如有错误,敬请指正,谢谢!!