递归原理
在递归过程中,函数将自身作为子例程调用。不断拆解为子问题,直到子问题无需进一步调用。
示例
- 以相反的顺序打印字符串
public static void mian(String[] args){
recurrence(0,str);
}
public void recurrence(int index ,char[] str){
if(str==null ||index>=str.length)
return;
help(index+1,str);
//在index 未达到str.length时不执行输出 直到达到 满足if条件判断 返回,执行输出 str[str.length-1]
System.out.print(str[index]);
}
1.1 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
class Solution {
public void reverseString(char[] s) {
recurrence(0,s);
}
public void recurrence(int index,char[] str){
if(str==null||index>=str.length){
return ;
}
recurrence(index+1,str);
//理解什么时候执行if语句 是关键.参照 eg 1
if(index>=str.length/2){
int last=str.length-1-index;//-1很关键
char temp=str[last];//前后数原地交换
str[last]=str[index];
str[index]=temp;
}
System.out.print(str[index]);
}
}
- 给定链表,交换每两个相邻节点并返回其头节点。
例如,对于列表 1-> 2 -> 3 -> 4,我们应当返回新列表 2 -> 1 -> 4 -> 3 的头节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
swap(head);
return head;
}
public void swap(ListNode head){
if(head==null||head.next==null){
return ;
}
swap(head.next.next);
int temp=head.next.val;
head.next.val=head.val;
head.val=temp;
}
}