查看: 1682|回復: 6|關注: 0
打印 上一主題 下一主題

辽宁快乐12走势图前三: [已解決] MATLAB 自定義二次方程求根函數的問題

[復制鏈接]

新手

7 麥片

財富積分


辽宁快乐12预测一号码推荐号码 www.exedlj.com.cn 050


1

主題

5

帖子

0

最佳答案
跳轉到指定樓層
1#
本帖最后由 MATLAB__Rookie 于 2019-2-24 13:32 編輯

  1. function y=quadform(a,b,c)
  2. if b^2-4*a*c<0
  3.     disp('The quadratic equations has no real roots')
  4. elseif b^2-4*a*c==0 %???????,????:????????
  5.     x1=quadform(a,b,c);
  6.     S1=['The quadratic equation has real roots: ',num2str(x1)];
  7.     disp(S1)
  8. else
  9.     x1=quadform(a,b,c);
  10.     x2=c/(a*x1);
  11.     S2=['The quadratic equation has real roots: ',num2str(x1),' and ',num2str(x2)];
  12.     disp(S2)
  13. end
  14. y=(-b-sign(b)*sqrt(b.^2-4*a*c))/(2.*a);
  15. end
復制代碼

以上是自定義的函數

  1. answer2=quadform(1,-2,1)
復制代碼



  1. answer3=quadform(1,-300,1)
復制代碼

當我調用此函數的時候出現錯誤

出問題的語句是

  1.     x1=quadform(a,b,c);
復制代碼

錯誤信息:
Out of memory. The likely cause is an infinite recursion within the program.

Error in quadform (line 5)
    x1=quadform(a,b,c);

請問問題出在哪里?為什么會是“infinite recurison”?

論壇優秀回答者

權威

9155 麥片

財富積分



11

主題

1萬

帖子

1994

最佳答案
  • 關注者: 538
2#
發表于 2019-2-24 13:52:01 | 只看該作者
本帖最后由 jingzhaos 于 2019-2-24 13:53 編輯

你想遞歸調用嗎?
這個方程解法不滿足遞歸調用的條件的。
  1. function y=quadform(a,b,c)
  2. det=b^2-4*a*c;
  3. if det<0
  4.     y='The quadratic equations has no real roots';
  5. elseif det==0
  6.     y=['The quadratic equation has real roots: ',num2str(-b/(2*a))];
  7. else
  8.     x1=-b/(2*a)+sqrt(det);
  9.     x2=-b/(2*a)-sqrt(det);
  10.     y=['The quadratic equation has real roots: ',num2str(x1),' and ',num2str(x2)];
  11. end
  12. end
復制代碼

論壇優秀回答者

5

主題

1462

帖子

409

最佳答案
  • 關注者: 121
3#
發表于 2019-2-24 13:53:37 | 只看該作者 |此回復為最佳答案
就是無窮遞歸了唄,隨便找本基礎的編程書都會講的,你這個函數,在b^2-4*a*c==0或者b^2-4*a*c>0這兩種情況下,還沒進行其他運算,就又調用了原函數,這就導致,每次調用,其實也只是判斷b^2-4*a*c的數值并再次嵌套調用原函數,這么無限嵌套下去當然就陷入死循環了。

改成
  1. clear;clc;
  2. quadform(1,-24,144)
  3. quadform(1,-5^4,1)

  4. function quadform(a,b,c)
  5. [email protected](a,b,c) (-b-sign(b)*sqrt(b.^2-4*a*c))/(2.*a);
  6. if b^2-4*a*c<0
  7.     disp('The quadratic equations has no real roots')
  8. elseif b^2-4*a*c==0 %???????,????:????????
  9.     x1=y(a,b,c);
  10.     S1=['The quadratic equation has real roots: ',num2str(x1)];
  11.     disp(S1)
  12. else
  13.     x1=y(a,b,c);
  14.     x2=c/(a*x1);
  15.     S2=['The quadratic equation has real roots: ',num2str(x1),' and ',num2str(x2)];
  16.     disp(S2)
  17. end
  18. end
復制代碼


The quadratic equation has real roots: 12
The quadratic equation has real roots: 624.9984 and 0.0016

新手

7 麥片

財富積分


050


1

主題

5

帖子

0

最佳答案
4#
 樓主| 發表于 2019-2-24 14:04:56 | 只看該作者
jingzhaos 發表于 2019-2-24 13:52
你想遞歸調用嗎?
這個方程解法不滿足遞歸調用的條件的。

不,我沒有想遞歸調用。只是想設置一個能算二次方程根的函數而已。

新手

7 麥片

財富積分


050


1

主題

5

帖子

0

最佳答案
5#
 樓主| 發表于 2019-2-24 14:09:34 | 只看該作者
TouAkira 發表于 2019-2-24 13:53
就是無窮遞歸了唄,隨便找本基礎的編程書都會講的,你這個函數,在b^2-4*a*c==0或者b^2-4*a*c>0這兩種情況 ...

謝謝
所以要在自定義的函數前面把輸入的值先填好嗎?

新手

7 麥片

財富積分


050


1

主題

5

帖子

0

最佳答案
6#
 樓主| 發表于 2019-2-24 14:14:22 | 只看該作者
TouAkira 發表于 2019-2-24 13:53
就是無窮遞歸了唄,隨便找本基礎的編程書都會講的,你這個函數,在b^2-4*a*c==0或者b^2-4*a*c>0這兩種情況 ...

另外我想問一下這樣每當我想使用這個函數都需要在下面復制一遍代碼嗎?

新手

7 麥片

財富積分


050


1

主題

5

帖子

0

最佳答案
7#
 樓主| 發表于 2019-2-24 14:27:53 | 只看該作者
TouAkira 發表于 2019-2-24 13:53
就是無窮遞歸了唄,隨便找本基礎的編程書都會講的,你這個函數,在b^2-4*a*c==0或者b^2-4*a*c>0這兩種情況 ...

我懂了 謝謝
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

關閉

站長推薦上一條 /4 下一條

快速回復 辽宁快乐12预测一号码推荐号码 返回列表