再帰的には元々so easy_;-連載が可能だった(3)
今回はいくつかの例を通して、再帰的な理解と熟練を深めます。
前回の練習問題があります。再帰逆順で全体のデータを含むチェーンを出力します。
まずこの練習問題を完成します。
プログラマにとって、コードは一番いいコミュニケーションツールです。何も言わないで、コードを付けます。
例えば:
入力整数1234、出力は4321です。
入力整数7890、出力は0957です。
問題を解く:
このように見られます。
まずその数の桁数を出力します。
この数/10後の商を、またこの商の位に出力します。
これをもって、商が0である(つまり最高位/10の商)まで送り続けます。
コード:
正の整数の各数字の和を出力します。
例えば、入力1234、出力10。
整数逆順出力の考え方を参照してください。
階段をのぼる
問題の説明
階段はN階あります。上の階は1階に上がることができます。2階に上がることもできます。一つのプログラムを作って、計算すると、いくつかの違った歩き方があります。
問題を解く:
分析してみます。階段は1つしかないです。2つの歩法があります。1回に2つの階段を歩くか、2回に1つの階段を歩くか、2つの歩法があります。1つの階段を先に行くと3-1=2つの階段が残ります。歩法は2階の歩数に等しいので、先に2つの階段があります。3-2=1つの階段が残っています。歩数が一段階の歩数に等しいのは、足し算の原理によると、f 3=f(3-1)+f(3-2)四段の階段です。2種類の歩法があります。1段先に4-1=3段が残っています。歩数は三段の歩数に等しいので、2段先に行くと、4-2=2段が残っています。計算式は、f(n)=f(n-1)+f(n-2)f(1)=1 f(2)=2です。
コード:
前回の練習問題があります。再帰逆順で全体のデータを含むチェーンを出力します。
まずこの練習問題を完成します。
プログラマにとって、コードは一番いいコミュニケーションツールです。何も言わないで、コードを付けます。
public class Hello {
public static void main(String[] args) {
LinkedList list=createLinkedList();
//list.print();
list.revertPrint();//
}
/* , */
public static LinkedList createLinkedList() {
LinkedList list=new LinkedList();
for(int i=11;i<=20;i++) {
list.add(i);
}
return list;
}
}
package test;
/**
*
*/
public class LinkedList {
// Node,
private class Node {
Node next; //
public int data;//
public Node(int data) {
this.data = data;
this.next = null;
}
}
// ----
public Node head = null; //
//
public void add(int data) {
Node nodeNew = new Node(data);
if (null == head) {
head = nodeNew;
return;
}
Node pre = head;
Node p = head.next;
while (p != null) {
pre = p;
p = p.next;
}
pre.next = nodeNew;
}
//
public void print() {
Node p = head;
while (p != null) {
System.out.print(p.data + " ");
p = p.next;
}
}
//
public void revertPrint() {
rP(head);
}
//
public void rP(Node node) {
if (null == node)
return;
rP(node.next);
System.out.print(node.data + " ");
}
}
整数逆順序出力例えば:
入力整数1234、出力は4321です。
入力整数7890、出力は0957です。
問題を解く:
このように見られます。
まずその数の桁数を出力します。
この数/10後の商を、またこの商の位に出力します。
これをもって、商が0である(つまり最高位/10の商)まで送り続けます。
コード:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(" ");
int n=sc.nextInt();
if(n==0) {
System.out.println(0);
return;
}else if(n<0) {
System.out.print('-');
n=0-n;
}
p(n);
}
static void p(int n) {
if(n==0)
return;
System.out.print(n%10);
p(n/10);
}
思考問題:正の整数の各数字の和を出力します。
例えば、入力1234、出力10。
整数逆順出力の考え方を参照してください。
階段をのぼる
問題の説明
階段はN階あります。上の階は1階に上がることができます。2階に上がることもできます。一つのプログラムを作って、計算すると、いくつかの違った歩き方があります。
問題を解く:
分析してみます。階段は1つしかないです。2つの歩法があります。1回に2つの階段を歩くか、2回に1つの階段を歩くか、2つの歩法があります。1つの階段を先に行くと3-1=2つの階段が残ります。歩法は2階の歩数に等しいので、先に2つの階段があります。3-2=1つの階段が残っています。歩数が一段階の歩数に等しいのは、足し算の原理によると、f 3=f(3-1)+f(3-2)四段の階段です。2種類の歩法があります。1段先に4-1=3段が残っています。歩数は三段の歩数に等しいので、2段先に行くと、4-2=2段が残っています。計算式は、f(n)=f(n-1)+f(n-2)f(1)=1 f(2)=2です。
コード:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println(" , ");
int n=sc.nextInt();
int step=stair(n);
System.out.println(step);
}
static int stair(int n){
if(n==1)
return 1; // , 1
if(n==2)
return 2; // , 2
return stair(n-1)+stair(n-2);
}