LeetCode探索--递归(递归原理)

本文深入探讨递归原理,解释其工作方式及如何解决复杂问题。通过递归算法分析时间和空间复杂度,并以反转字符串为例,展示递归在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这张探索卡片中,我们回答了以下几个问题:

  • 什么是递归?它是如何工作的?
  • 如何递归地解决问题?
  • 如何分析递归算法的时间和空间复杂度?
  • 如何更好地运用递归?

一、 递归原理

递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用

你可能想知道如何实现调用自身的函数。诀窍在于,每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题无需进一步递归就可以解决的地步。

为了确保递归函数不会导致无限循环,它应具有以下属性:

一个简单的基本案例(basic case)(或一些案例) —— 能够不使用递归来产生答案的终止方案。
一组规则,也称作递推关系(recurrence relation),可将所有其他情况拆分到基本案例。
注意,函数可能会有多个位置进行自我调用。

二、反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

分析:
我们实现递归函数 helper,它接受三个参数:数组s,left 左指针和 right 右指针。
如果 left>=right,不做任何操作。
否则交换 s[left] 和 s[right] 和调用 helper(s,left + 1, right - 1)。
首次调用函数我们传递首尾指针反转整个字符串 helper(s,0, len(s) - 1)。

class Solution {
    public void reverseString(char[] s) {
        helper(s,0,s.length-1);
    }
    public void helper(char[] s,int left,int right){
        if(left>=right) return;
        char tmp = s[left];
        s[left++] = s[right];
        s[right--] = tmp;
        helper(s,left,right);
    }
}

时间复杂度:O(n)。执行了n/2次的交换。
空间复杂度:O(n),递归过程中使用的堆栈空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值