上一篇文章解了一下華為面試題,有小夥伴說,有改編的版本為走三步需要歇一次,下次隻能走兩步或者一部怎麼算呢?下面的連結為我的上一篇文章,有一定的關聯性,本篇文章,主要是增加了一個限制條件,(即,走三步歇一次);
這裡給對外連結接: 不歇着的情況的詳細的解釋.
先來看下代碼吧:
不歇着的情況:
#include<iostream>
using namespace std;
int number(int n) {
if (n == 1) {
return 1;
}
else if (n == 2) {
return 2;
}
else if (n == 3) {
return 4;
}
else {
return number(n - 1) + number(n - 2) + number(n - 3);
}
}
int main() {
int n = 1000;
cin >> n;
cout << endl << number(n);
}
思路很簡單清晰對嗎??如果我不歇着,那麼就無窮遞歸就可以了,在上面那個連結裡有詳細的解釋。。
歇着的情況:
#include<iostream>
using namespace std;
int number1(int n);
int number2(int n);
int main() {
cout << "請輸入要走的台階階數:";
int n;
cin >> n;
cout << endl << number1(n);
}
int number1(int n) {
if (n == 1) {
return 1;
}
else if (n == 2) {
return 2;
}
else if (n == 3) {
return 4;
}
else {
return number1(n - 1) + number1(n - 2) + number2(n - 3); //如果走三步後,下次就不再走三次調用number2()函數
}
}
int number2(int n) {
if (n == 1) {
return 1;
}
else if (n == 2) {
return 2;
}
else {
return number1(n - 1) + number1(n - 2);//如果走三步,下次就不再走三步是以不在遞歸計算三步的情況
}
}
但是,我要歇着,那好,我們就加一個限制條件,即,每走一次三步,我們下次遞歸的時候,就不再包含繼續走三次的遞歸了。
我寫了兩個函數,number1()函數就是正常遞歸,但是,當下走三步的情況,即,
else {
return number1(n - 1) + number1(n - 2) + number2(n - 3); //如果走三步後,下次就不再走三次調用number2()函數
}
注意:是number2(n-3),而不是number1(n-3),而仔細看number2(int n)會很容易發現,裡面遞歸調用的時候沒有(n-3)的情況,這也就自然排除了走三步後,下一次繼續走三步的情況。
其實,說白了就是兩個函數交叉調用,走一步或兩步,我就遞歸調用number1(int n);走三步,我就調用number2(int n),即下一次隻能走一次或者兩次。而重要的是在number2(int n)中,我繼續調用number1(),還是可以走三步。‘
這樣就限制了走三步歇一次的這個條件。
歡迎評論區指正,謝謝!!
如果你覺得還可以,也可以點個贊,當作是一個鼓勵吧!謝謝!!