題目描述:輸入n值,使用遞迴函式,求楊輝三角形中各個位置上的值。
輸入:乙個大於等於2的整型數n
輸出:題目可能有多組不同的測試資料,對於每組輸入資料,
按題目的要求輸出相應輸入n的楊輝三角形。
樣例輸入:
6樣例輸出:
1 11 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include#include/*
*非遞迴方式
*//*int main(void)
} for (int i = 0; i < num - 1; i++)
printf("\n");
} }return 0;
}*/typedef struct prelinepre_line;
pre_line output(int,pre_line);
int main(void)
return 0;
}pre_line output(int n,pre_line li)
else
printf("%d", li_new.a[i][0]);
for (int j = 1; j <= i + 1; j++)
printf("\n");
return li_new;
}}
這個題目,如果不用遞迴做,明顯**量少得多而且思路也很清晰。
就是先定義乙個二維陣列,然後進行問題求解。順便說一句,資料結構真的很重要,因為我一開始想的還是用一維陣列來做,之後有點招架不住。
因為最近剛好又回顧了一遍有關遞迴的演算法,於是又尋(zuo)思(si)使用遞迴的方法來求解問題。
面前首先遇到的難題就是怎麼把陣列在兩個函式之間傳遞。因為除了base case 之外的其他每一行列印都必須要前一行的資料。所以我在遞迴函式裡必然要返回前一行的資料。
之後搜尋了一下這個問題,看到可以用結構體的方法傳遞多維陣列。
於是,入坑。因為真的是還不熟悉結構體的用法。
於是,一開始是在傳遞結構體的指標。結構體宣告如下:
typedef struct preline*pre_line;
看到和正確**的不同了嗎?結果在編譯時都沒有通過,說是指標li使用前沒有初始化。
這時才恍然大悟,依昔記得當時c語言老師每次定義結構體,使用時不忘先malloc一下。
話不多說,我馬上又去初始化了一下。
可是執行時,第一行正確列印「1 1」,第二行中間那個值卻十分怪異。
一步步除錯發現,每次遞迴呼叫函式完返回後,即使賦值給了li_new,可是li_new裡的資料全都是「新鮮"的-------應該說是未初始化的。
這才恍然大悟--------因為傳遞的是指標變數,當output()每次執行完成之後,裡面的li_new會自動銷毀,所以即使外層li_new得到了上一層的位址,指向的地區也已經沒有了已經賦值的陣列。
跳出大坑
既然傳遞結構體指標行不通,那麼直接傳遞結構體是否可行呢? 結果是肯定的。
函式返回後會將output()函式中li_new的記憶體按位拷貝給外層的li_new;所以li_new裡面的陣列值也會被完全保留下來。在遞迴中使用結構體和平時使用時還是有很大區別的。
馬不停蹄地改完**,一步步執行,終於發現列印第二行時,上一層呼叫的output()傳遞過來的陣列資訊都儲存下來了。
crn,你一定要加油!
看到有人的迭代方法和我的不太一樣,貼過來,學習一下。 來自
#include#includeint a[100][100];
int fun(int n,int m)
}int main()
puts("");}}
return 0;
}
楊輝三角形
關於楊輝三角的論述 問題描述 楊輝三角形又稱pascal 三角形,它的第 i 1行是 a b i 的展開式的係數。它的乙個重要性質是 三角形中的每個數字等於它兩肩上的數字相加。下面給出了楊輝三角形的前4行 1 11 2 1 1 3 3 1 給出n,輸出它的前n行。輸入格式 輸入包含乙個數n。輸出格式...
楊輝三角形
基礎練習 楊輝三角形 時間限制 1.0s 記憶體限制 256.0mb 錦囊1 錦囊2 錦囊3 問題描述 楊輝三角形又稱pascal三角形,它的第i 1行是 a b i 的展開式的係數。它的乙個重要性質是 三角形中的每個數字等於它兩肩上的數字相加。下面給出了楊輝三角形的前4行 1 11 2 1 1 3...
楊輝三角形
在螢幕上顯示楊輝三角形 問題分析與演算法設計 楊輝三角形中的數,正是 x y 的n次方冪展開式中各項的係數。從楊輝三角形的特點出發,可以總結出 1 第n行有n 1個值 設起始行為第0行 2 對於第n行的第j個值 n 2 當 j 1 或 j n 1 時 其值為1 當 j!1 且 j!n 1時 其值為第...