Contact me:

把递归拆出来理解

这两天写几个递归算法题有点心得,记录一下

先说结论

递归过程:(判断条件)-进入--操作-(判断条件)-退出

rec(a){
if(满足退出)-退出
操作
rec(a)
(操作)
}

从链表逆序开始

// 获取节点所在位置,逆序
public int length(ListNode node, int n) {
if (node == null)
return 0;
int pos = length(node.next, n) + 1;
//获取要删除链表的前一个结点,就可以完成链表的删除
if (pos == n + 1)
node.next = node.next.next;
return pos;
}

拆开

// 获取节点所在位置,逆序
public int length(ListNode node, int n) {
if (node == null)
return 0;
int pos = length(ListNode node, int n) {
if (node == null)//exit
return 0;/////exit
int pos = length(ListNode node, int n) {
if (node == null)//exit
return 0;/////exit
int pos = length(node.next, n){...} + 1;
}+ 1;
.
.
.
}+1
//获取要删除链表的前一个结点,就可以完成链表的删除
if (pos == n + 1)
node.next = node.next.next;
return pos;
}

达到出口条件

// 获取节点所在位置,逆序
public int length(ListNode node, int n) {
if (node == null)
return 0;
int pos = length(ListNode node, int n) {
if (node == null)//exit
return 0;/////exit
int pos = length(ListNode node, int n) {
if (node == null)//exit
return 0;/////exit
int pos = length(node.next, n){...//pos=pos+1 |6
if (node == null)//exit
return 0;/////exit
int pos = length(ListNode node, int n) {// |3.2
if (node == null)//true |1
return 0;/////exit 0 |2
} + 1; //pos =0+1 |3.1
if (pos == n + 1)// false |4
node.next = node.next.next;
return pos; //return 0 |5
}+ 1;
.
.
.
}+1
//获取要删除链表的前一个结点,就可以完成链表的删除
if (pos == n + 1)
node.next = node.next.next;
return pos;
}

判断回文链表

ListNode temp;
public boolean isPalindrome(ListNode head) {
temp = head;
return check(head);
}
private boolean check(ListNode head) {
if (head == null)
return true;
boolean res = check(head.next) && (temp.val == head.val);
temp = temp.next;
return res;
}

拆开

ListNode temp;
public boolean isPalindrome(ListNode head) {
temp = head;
return check(head);
}
private boolean check(ListNode head) {
if (head == null)
return true;
boolean res = check(head.next){
if (head == null)
return true;
boolean res = check(head.next){
if (head == null)
return true;
boolean res = /*check(head.next)*/true && (temp.val == head.val);//reach exit 1
temp = temp.next; //下一个 2
return res; //返回上级 3
} && (temp.val == head.val); //判断 4
temp = temp.next;
return res;
} && (temp.val == head.val);
temp = temp.next;
return res;
}

虽然这个题递归会重复计算一次,但是这个递归属于看得懂很难想出来

posted @   impwa  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示