递归好难,学不明白,该怎么办。现在就处于完全懵的状态。代码都看不明白更别说自己打了,整整一天才大概知道斐波那契代码怎么运行,但是还是不明白递归,也不会用,换一种方式用递归估计就不会了。在线求解……我该怎么办????????????
不用关心运行方式,只需要知道结果正确就行,比如斐波那契数列,定义就是前两个元素是1,后面每个元素都是它前面两个元素的和,这样就可以写出代码:
int f(int n)//第n项的值
{
if(n<=2)
return 1;
return f(n-1)+f(n-2);
}
这不就是它的定义吗,你现在可以不用去关心执行过程,最后慢慢就明白了
《C和指针》对递归讲的挺详细,同时也写了这么句话:“阅读递归函数最容易的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。如果每个步骤正确无误,限制条件设置正确,并且每次调用之后更接近限制条件,递归函数总是能够正确地完成任务。”
写之前先找规律,递归就是重复规律的运行,最后要设定一个结束条件,不然就会造成栈溢出
确定出口 避免栈溢出 递归其实不难
public class Demo5 {
public static void main(String[] args) {
// 递归计算5!
int f = f(5);
System.out.println(f);
}
public static int f(int n){
if (n == 1){
return 1;
}
return n*f(n-1);
}
}
结果
120
递归说白了就是自己调用自己。这段代码不知能否看懂。方法f(n)在自己调用自己,如果不懂可以私信我。重点看return那里
递归确实很难,据说递归有压栈和出栈一说,楼主不妨先搞懂栈的相关概念和使用,然后再去了解递归的概念。而且建议多刷一些会用到递归解决问题的算法,那么久而久之就能明白了。比如你提到的斐波那契数,但是斐波那契数使用递归并不是最优解法,最优解法是 DP。但是对于二叉树的前后中序遍历,使用递归似乎更优雅。
一下代码楼主可以体会一下:根据values.add(); 的位置来了解递归的性质
public class RecursiveCalling{
List<Integer> values = new ArrayList<>();
// 前序遍历
public void preorderTraversal (TreeNode root) {
if(root == null) return;
values.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
}
// 中序遍历
public void inorderTraversal (TreeNode root) {
if(root == null) return;
inorderTraversal (root.left);
values.add(root.val);
inorderTraversal (root.right);
}
// 后序遍历
public void postorderTraversal (TreeNode root) {
if(root == null) return;
postorderTraversal (root.left);
postorderTraversal (root.right);
values.add(root.val);
}
}