【详解递归-创新互联
- 什么是递归?
- 图解运行机制
- 常见的递归题目
- 1. 求阶乘
- 2. 斐波那契数
- 3. 求台阶数(实际就是斐波那契数问题)
- 4.数字反转
图解运行机制递归,就是在运行的过程中调用自己。
来先看一段代码
C语言版
#includeint Recursion(int num)
{if (num< 1)
return 0;
return Recursion(num - 1) + num;
}
int main()
{int ans = Recursion(3);
printf("%d\n", ans);//结果是多少呢?
return 0;
}
Java版
public class Test {public static int Recursion(int num){if (num< 1)
return 0;
return Recursion(num - 1) + num;
}
public static void main(String[] args) {int ans = Recursion(3);
System.out.println(ans);//结果是多少呢?
}
}
答案
可以看出答案都为6,那为该程序是如何进行计算的呢?
首先递归函数不断向下计算,直到跳出递归的循环(即num<1)
然后将值依次向上带会去
方法(函数)递归调用 递归重要规则
1.执行一个方法(函数)时,就创建一个新的受保护的独立空间(栈空间)
2.方法(函数)的局部变量是独立的,不会相互影响。(如:temp,它的值每次在方法(函数)中都为1)
int Recursion(int num)
{int temp = 1;
if (num == 1)
return 1;
return Recursion(num - 1) * num;
}
常见的递归题目 1. 求阶乘3.如果方法(函数)中使用的是引用类型变量(比如数组),就会共享该引用类型的数据
4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError
5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
C语言版
#includeint Recursion(int num)
{if (num == 1)
return 1;
return Recursion(num - 1) * num;
}
int main()
{int ans = Recursion(3);
printf("%d\n", ans);
return 0;
}
Java版
public class Test {public static int Recursion(int num)
{if (num == 1)
return 1;
return Recursion(num - 1) * num;
}
public static void main(String[] args) {int ans = Recursion(3);
System.out.println(ans);
}
}
2. 斐波那契数斐波那契数的排列是:0,1,1,2,3,5,8,13,21,34,55,89,144……。依次类推下去,你会发现,
它后一个数等于前面两个数之和,在这个数列中的数字,就被称为斐波那契数
很容易得到斐波那契数的递推式为:
f(n) = f(n-1) + f(n-2),其中f(0) = 0,f(1) = 1
C语言版
#includeint Recursion(int n)
{if (n<= 1)
return n;
return Recursion(n - 1) + Recursion(n - 2);
}
int main()
{int ans = Recursion(3);
printf("%d\n", ans);
return 0;
}
Java版
public class Test {public static int Recursion(int n){if (n<= 1)
return n;
return Recursion(n-1) +Recursion(n-2);
}
public static void main(String[] args) {int ans = Recursion(3);
System.out.println(ans);
}
}
3. 求台阶数(实际就是斐波那契数问题)假设这里有n个台阶,每次你可以跨1个台阶或者两个台阶,请问走这n个台阶有多少种走法。
每一次有两种走法,结束的条件是n = 1的时候只有一种走法,n = 2的时候有两种走法,
也就是说
f(1) = 1 , f(2) = 2
递归式如下:
f(n) = f(n-1) + f(n-2)
C语言
#includeint Recursion(int n)
{if (n == 1)
return 1;
if (n == 2)
return 2;
return Recursion(n - 1) + Recursion(n - 2);
}
int main()
{int ans = Recursion(3);
printf("%d\n", ans);
return 0;
}
Java版
public class Test {public static int Recursion(int n){if (n == 1)
return 1;
if (n == 2)
return 2;
return Recursion(n-1)+Recursion(n-2);
}
public static void main(String[] args) {int ans = Recursion(3);
System.out.println(ans);
}
}
4.数字反转将数字123,以321的形式输出,以/和%将余数和商不断缩小
同样可以用递归方法,直接上代码
C语言
#includevoid Recursion(int n) {printf("%d", n % 10);
if (n >= 10)
Recursion(n / 10);
}
int main()
{Recursion(123);
return 0;
}
Java版
public class Test {public static void Recursion(int n){System.out.print(n % 10);
if (n >= 10){Recursion(n / 10);
}
}
public static void main(String[] args) { Recursion(123);
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享标题:【详解递归-创新互联
文章源于:http://cdiso.cn/article/dsjhsc.html