天天看點

華為1000階台階問題,每次走一步或者兩步或者三步,走一次三步後接下來的一次隻能走一步或者兩步(即,歇一下),問:如果有1000階台階,有多少種走法。。

上一篇文章解了一下華為面試題,有小夥伴說,有改編的版本為走三步需要歇一次,下次隻能走兩步或者一部怎麼算呢?下面的連結為我的上一篇文章,有一定的關聯性,本篇文章,主要是增加了一個限制條件,(即,走三步歇一次);

這裡給對外連結接: 不歇着的情況的詳細的解釋.

先來看下代碼吧:

不歇着的情況:

#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(),還是可以走三步。‘

這樣就限制了走三步歇一次的這個條件。

歡迎評論區指正,謝謝!!

如果你覺得還可以,也可以點個贊,當作是一個鼓勵吧!謝謝!!