返回資料時賦值

2021-10-21 02:21:38 字數 2154 閱讀 1640

發現乙個以前沒有注意到的地方

#include

using

namespace std;

intgetans()

intmain()

//執行結果

9

挺有意思的,在main中呼叫了getans()函式,getans()中,最後一句是先計算a + b,之後將a + b 賦值給ans,再之後返回ans,此時getans()中ans 的值已經是9了,雖然呼叫結束之後,getans()所在的記憶體被釋放掉了。

這可以用來幹什麼呢?準確來說,在函式中,返回值語句可以是一條計算賦值語句,這一點可以做什麼呢?

其實可以用來優化用遞迴法來求斐波那契數列。

斐波那契數列都知道,f(0) = 0,f(1) = 1,f(n) = f(n-1) + f(n-2),這幾乎是學習遞迴的必備知識。

首先來看一般的斐波那契數列求法。

#include

#include

using

namespace std;

intgetans

(int n)

intmain()

//執行用時

1134903170

用時7297

上面令n = 45,可以看到f(45) = 1134903170,但是用時為7297ms,這可以說是很慢了。因為涉及了大量的重複計算。沒有利用起來。

現在可以使用上面的知識點「在函式中,返回值語句可以是一條計算賦值語句」。

#include

#include

#include

using

namespace std;

int f[50]

;//斐波那契數列

intgetans

(int n)

intmain()

//執行結果

1134903170

用時1

結果非常明顯,使用了這條結論,可以使得時間變為了1毫秒。

當然了,如果是僅僅求斐波那契數列,最好還是使用遞推。

#include

#include

#include

using

namespace std;

intmain()

//執行結果

1134903170

用時0

不過可以看到,使用優化過的遞迴與遞推,執行時間相差無幾。

以下出自《演算法筆記》

排列組合裡面c(n,m)意為從n個數裡面選擇m個不同的數。且有c(n,n) = 1,c(n,0) = 1。

可以使用公式來計算,但是非常容易超出int型別的資料範圍。

可以遞迴來做。這種選取可以分為兩種不同的方案數之和:一是不選最後乙個數,從前n - 1個數中選m個數;第二種方案是選最後乙個數,並且從前n - 1個數中選m - 1個數。

即c(n,m) = c(n-1,m)+ c(n-1,m-1)。

從直觀上來看,該公式總是將n減1,而m要麼保持原樣,要麼減1,直到達到邊界m等於n或者是m等於0。

於是可以很快得到下面的**

long

long

getans

(int n,

int m)

這個計算完全不涉及到階乘,但是有另外的問題:重複計算。在計算c(n,m)的過程中,有很多的資料是已經計算過得了,但是沒有在再次使用時直接使用,而是又去計算了一遍。因此不妨將已經計算過了的資料進行記錄,下次碰到時,直接使用。

//res陣列中res[n][m]為c(n,m);

long

long res[67]

[67]=

;//初始值為0

long

long

getans

(int n,

int m)

遞推

//res陣列中res[n][m]為c(n,m);

long

long res[67]

[67]=

;//初始值為0,res是乙個下三角陣

void

getans()

}}

ajax返回資料賦值給前台變數

var result ajax console.log result 以這種方式會的直接是json格式 伺服器相應的json資料 var result ajax console.log result 以這種方式返回的也是json 對服務相應的資料進行了包裝 如下圖 responsetext為伺服器響...

使用okhttp時沒有返回json資料

今天踩過的大坑.這是一段使用okhttp進行post請求的 執行結果返回的是com.squareup.okhttp.internal.http.realresponsebody 52858c28這段字串,一臉懵逼,本來應該是返回一段json字串的。解決方法 replace string json r...

go panic時如何讓函式返回資料

現在有這樣乙個問題 某函式如果正常執行,返回0,如果panic,則返回1,怎麼搞呢?package main import fmt func test int var p int p 0 return 0 func main 這樣顯然不行,因為那個return 1是針對匿名函式的,而非test函式。...