我正在嘗試將斐波那契演算法從 python 重寫為 C,但遇到了一些問題。下面是python中的演算法,我得到了正確的答案,但是在用C撰寫之后:
def fib(n):
a, b = 1,1
for i in range(n):
a, b = a b, a
print(a, b)
return b
print(fib(8))
當我用 C 撰寫它時,我得到了 2 的冪 - 我不確定如何以及是否可以糾正它。
#include<stdio.h>
int fib(n){
int a = 1;
int b = 1;
for (int i=0; i<n; i ){
a = a b;
b = a;
}
return b;
}
int main(void){
int n;
printf("Enter the # of the fibonacci number in sequence:");
scanf("%d", &n);
int r = fib(n);
printf("%d\n", r);
}
uj5u.com熱心網友回復:
只需添加第三個變數即可進行額外處理
#include <stdio.h>
int fib(int n) {
int a, b, c;
a = 0;
b = 1;
c = 0;
for (int i = 0; i < n; i ) {
a = b c;
b = c;
c = a;
}
return a;
}
int main() {
int n;
n = fib(10); // 55
printf("%d\n", n);
}
uj5u.com熱心網友回復:
零也是一個斐波那契數!
嘗試:
int fib(int n){
int a = -1;
int b = 1;
for (int i = 0; i < n; i ) {
int t = a b;
a = b;
b = t;
}
return b;
}
此外,到目前為止,沒有一個答案(包括這個答案)解釋了 C 中未定義的有符號整數溢位。不過,對于像這樣的微不足道的程式,可以忽略它。什么時候n大于47它在我的電腦上溢位。
uj5u.com熱心網友回復:
只需簡單更改兩個變數即可完成b = a-b。但是,優化編譯器將使用第三個暫存器作為臨時變數,而不是這樣做b = a - b;
#include<stdio.h>
int fib(n){
int a = 1;
int b = 0;
for (int i = 0; i < n; i ){
a = a b;
b = a-b;
}
return b;
}
int main(void){
int n;
printf("Enter the # of the fibonacci number in sequence:");
scanf("%d", &n);
int r = fib(n);
printf("%d\n", r);
return 0;
}
uj5u.com熱心網友回復:
在 Python 中,當執行多重賦值陳述句時,右側的所有運算式都使用變數的當前值進行計算,然后將這些值系結到左側給定的變數。例如,宣告
a, b = a b, a
使用 a 和 b 的當前值計算運算式 a b 和 a,然后將這些值分別系結到 a 和 b. 如果當前值為 a=1,b=1,則運算式的值分別為 1 1=2 和 1,因此我們得到 a=2,b=1。
但是,您的 C 代碼按順序執行兩條陳述句 a=a b 和 b=a,而不是并行執行(就像 Python 那樣)。首先對運算式 a b 求值(如果 a=1,b=1,則 a b=2),并將其值系結到變數 a(所以 a 為 2),最后是第二個中的運算式 a陳述句被評估(它的值是 2),它的值被系結到 b(所以 b=2)。如果要在陳述句 b=a 中使用 a (a=1) 的原始值,則必須在用 a b 覆寫 a 之前將該原始值存盤在臨時變數中,如下所示:
temp=a;
a=a b;
b=temp;
通常,您可以通過學習對程式進行手動模擬來找出程式出了什么問題,您可以在其中寫下(在紙上)程式中每個變數的當前值。例如,您可以將變數 a 和 b 寫在不同的行中,它們的初始值分別為 1 和 1,緊挨著它們。每次執行賦值陳述句時,使用當前值計算右側的運算式,并用這個新值覆寫左側的變數。因此,當您遇到 a=a b 時,您會將 a b 評估為 2(使用當前值),然后將 a 的當前值 1 劃掉并替換為 2。這樣,您可以使用鉛筆和紙獲得輸出,并找出程式出了什么問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465482.html
