c++递归详解

1. 什么是递归算法

递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。

大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。

递归算法核心思想是子问题。递归编程最常见的方法是函数的递归调用----函数自己调用自己。

例1 求n的阶乘。

用递归函数求n!。

【分析】

数学上 n! = 1*2*3…*n = n*(n-1)*…*2*1。

也可以递归定义为:

对应的递归函数可以写为:

递归函数的框架一般都是:

递归结束

+

递归调用自己本身函数的“子问题”

一.起源:

  汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

二.抽象为数学问题:

  如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

思考题:

写出下面3个问题的递归解决函数:

1、求 1+2+...+n

2、实现 pow(x, n) ,即计算 x n 次幂函数(即,x^n )。

输入:x = 2.10000, n = 3

输出:9.26100

输入:x = 2.00000, n = -2

输出:0.25000

解释:2-2 = 1/22 = 1/4 = 0.25

提示:

-100.0 < x < 100.0

-2^31 <= n <= 2^31-1

-10000 <= x^n <= 10000

3、找出第 N 个二进制字符串中的第 K

给你两个正整数 n k,二进制字符串 Sn 的形成规则如下:

l S1 = "0"

l 当 i > 1 时,Si = Si-1 + "1" + reverse(invert(Si-1))

其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)。

例如,符合上述描述的序列的前 4 个字符串依次是:

S1 = "0"

S2 = "011"

S3 = "0111001"

S4 = "011100110110001"

请你返回 Sn k 位字符 ,题目数据保证 k 一定在 Sn 长度范围以内。

输入:n = 3, k = 1

输出:"0"

解释:S3 "0111001",其第 1 位为 "0"

输入:n = 4, k = 11

输出:"1"

解释:S4 "011100110110001",其第 11 位为 "1"

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子小院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值