c言語関数の再帰呼び出し(ハノイ問題、階段再帰問題など)
最初にC言語に触れたとき、ここでの関数の再帰呼び出しはかなり複雑で理解しにくいと感じました。ここで、レビューの目的で、いくつかの再帰トピックを整理して紹介します。
1.再帰呼び出しとは何ですか
関数の再帰呼び出しとは、関数を呼び出すプロセスで関数自体を直接的または間接的に呼び出すことを指します。
2.主要な分析
重要な点は、解決すべき特定の問題の最初のn-1回とn番目のプロセスの間の再帰的関係を分析することです。さらに、再帰の開始条件を無視してはならず、個別に記述する必要があります。
3.例
3.1再帰的にnを見つけます!
分析:n!= n *(n-1)!;(n-1)!=(n-1)*(n-2)!……n = 1の場合、n!= 1。
機能コード:
int jiecheng(int n)
{
if(n==1)
return 1;
else
return(n*jiecheng(n-1));
}
3.2ハノイ(ハノイ)タワーの問題
分析:最初のn-1回と最後のn-1回の移動方法を理解します。n= 1の場合、この特殊なケースは個別に検討する必要があります。
n = 64を例にとると、考慮される問題解決手順は次のようになります。最初の63層をAからB(大きいものから小さいものへの順序)に移動できるマスターがいて、どのように移動しても、必要なことAの最後のレイヤーをCに移動し、次にBの63レイヤーをCに移動して、最後のステップを完了します。
順方向再帰:このマスターは、最初の63層をAからBに移動し、BからCに移動します。次の図に示すように、上記の方法も使用されます。
最後にn = 1に再帰します。
n = 1の場合、このレイヤーをA-> Cから変更するだけです。
機能コード:
void hanoi(int n, char A, char B, char C) //实现n层塔从A借助B移动到C。
{
void move(char a, char b);
if(n==1)
move(A, C);
else
{
hanoi(n-1, A, C, B); //前n-1层从A借助C移动到B
move(A, C); //第n层从A移到C
hanoi(n-1, B, A, C); //移动到B的n-1层借助A移动到C
}
}
void move(char a, char b) //定义打印函数
{
printf("%c->%c\n",a,b);
}
完全なコード:
#include<stdio.h>
#include<stdlib.h>
int main()
{
void hanoi(int n, char A, char B, char C);
char A='A', B='B', C='C';
int n;
scanf("%d",&n);
printf("%d层汉诺塔移动步骤为:\n",n);
hanoi(n, A, B, C);
return 0;
}
void hanoi(int n, char A, char B, char C) //实现n层塔从A借助B移动到C。
{
void move(char a, char b);
if(n==1)
move(A, C);
else
{
hanoi(n-1, A, C, B); //前n-1层从A借助C移动到B
move(A, C); //第n层从A移到C
hanoi(n-1, B, A, C); //移动到B的n-1层借助A移动到C
}
}
void move(char a, char b) //定义打印函数
{
printf("%c->%c\n",a,b);
}
操作結果(n = 64ステップが多すぎるため、例としてn = 3):
3.3階段を上る際の再帰的な問題
階段にはn段あります。1段、2段、または3段の階段を上ることができます。計算方法はいくつありますか。
分析:焦点は最後のステップにあります。最後のステップで移動するには、ステップ1、ステップ2、およびステップ3の3つの方法があります。最後のステップがレベル1までであると仮定して、最初のn-1ステップ(再帰を適用)を引き続き検討し、最後にすべてのステップがlad(n-1)+ lad(n-2)+ lad(n-3)になります。 )。
機能コード:
int lad(int n) //定义函数
{
if(n==1)
return 1;
else if(n==2)
return 2;
else if(n==3)
return 4;
else
return lad(n-1)+lad(n-2)+lad(n-3); //
}
完全なコード:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int lad(int n);
int n;
scanf("%d",&n);
printf("%d",lad(n));
return 0;
}
int lad(int n)
{
if(n==1)
return 1;
else if(n==2)
return 2;
else if(n==3)
return 4;
else
return lad(n-1)+lad(n-2)+lad(n-3);
}
演算結果:
4.まとめ
再帰の鍵は、末尾から開始し、最後のステップと前のn-1ステップの関係を見つけて、初期値の条件をリストすることです。