【详解递归-创新互联

目录标题
  • 什么是递归?
  • 图解运行机制
  • 常见的递归题目
    • 1. 求阶乘
    • 2. 斐波那契数
    • 3. 求台阶数(实际就是斐波那契数问题)
    • 4.数字反转

10余年的克什克腾网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都营销网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整克什克腾建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联从事“克什克腾网站设计”,“克什克腾网站推广”以来,每个客户项目都认真落实执行。什么是递归?

递归,就是在运行的过程中调用自己。

图解运行机制

来先看一段代码
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;
}

3.如果方法(函数)中使用的是引用类型变量(比如数组),就会共享该引用类型的数据
4.递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError
5.当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

常见的递归题目 1. 求阶乘

在这里插入图片描述

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

其他资讯